Java 如何在JUnit测试中重写类行为

Java 如何在JUnit测试中重写类行为,java,unit-testing,testing,junit,mockito,Java,Unit Testing,Testing,Junit,Mockito,我正在尝试为类a中的一个方法创建JUnit测试,该方法创建了类B的一个实例。由于我想隔离该方法的行为,我想用更简单的方法覆盖a的测试套件中B的方法,这将用于测试a 我已经尝试使用Mockito的Spy来实现这一点,但是据我所知,它只允许在方法调用时返回静态值,但是我需要用更简单的外部逻辑替换复杂的外部逻辑,同时考虑传递的参数 最好的方法是什么?如果我没有弄错,代码示例可能如下所示 public class A { public T doSth(){ String resul

我正在尝试为类a中的一个方法创建JUnit测试,该方法创建了类B的一个实例。由于我想隔离该方法的行为,我想用更简单的方法覆盖a的测试套件中B的方法,这将用于测试a

我已经尝试使用Mockito的Spy来实现这一点,但是据我所知,它只允许在方法调用时返回静态值,但是我需要用更简单的外部逻辑替换复杂的外部逻辑,同时考虑传递的参数


最好的方法是什么?

如果我没有弄错,代码示例可能如下所示

public class A {
    public T doSth(){
       String result = new B().callMethod();
    }
}
如果您能够修改源代码,那么下面的方法可能会非常有用,以使测试更易于测试

public class A {
    private MyInterface b;
    public A(MyInterface b){
      this.b = b;
    }
    public T doSth(){
       String result = b.callMethod();
    }
}
  • 引入类B正在实现的接口
  • 通过setter方法或构造函数注入B的实例,确保类A仅依赖于接口
  • 现在,您可以使用Mockito这样的模拟框架来配置结果值,或者只使用测试存根(实现您喜欢的接口和逻辑的内部类)

  • 干杯

    听起来您必须学习模拟您需要创建B的模拟实例,然后根据您要测试的场景对B上的调用返回不同的响应: