java - Mockito 无法模拟目标类构造函数中存在的函数调用

标签 java unit-testing mockito

我正在尝试使用 Mockito 和 JUnit 测试以下类:

public class A {
   private SomeClass someObject;
   private SomeImpClass someImpObject1;
   private SomeImpClass2 someImpObject2;

   public A(SomeImpClass someImpObject1, SomeImpClass2 someImpObject2){
       someObject = makeNewObject(someImpObject1, someImpObject2);
   }

   public makeNewObject(SomeImpClass1 someImpObject1, SomeImpClass2 someImpObject2){
       return new SomeObject(someImpObject1,someImpObject2);
   }

  public usingSomeObject(){
      someObject.doSomething();
  }
 }

所以,我使用 Mockito 和 JUnit 编写了一个单元测试:

@RunWith(MockitoJUnitRunner.class)
public class ATest {
  @Mock
  SomeImpClass1 someImpObject1;

  @Mock
  SomeImpClass2 someImpObject2;

  @Mock
  SomeObject someObject;

  @Spy
  A a;

 @Before
public void setUp() {
    when(A.makeNewObject).thenReturn(someObject);
    this.A = new A(this.someImpObject1, someImpObject2);
    when(someObject.doSomething).thenReturn(something);
}
}

我在这里面临的问题是,虽然我已经对函数 makeNewObject 进行了 stub 以返回 SomeClass 的模拟对象,但代码流仍然在函数(makeNewObject)内部进行并给出 null 异常。

我做错了什么? 我为此浪费了一天的时间。

使用 Mockito 不太流畅。

最佳答案

通过监视和 stub ,您将无法实现您的目标。 这是因为您的目标是 stub 构造函数中使用的方法..但是一旦创建了具体对象并监视它就无法开始 stub ..无法完成..

我建议在测试类中创建一个私有(private)类,该类扩展了被测类,覆盖构造函数中调用的方法,然后在测试中使用它:

@RunWith(MockitoJUnitRunner.class)
public class ATest {

  @Mock
  SomeObject someObjectMock;

  A a;

 @Before
 public void setUp() {
    this.a = new MyTest();
 }

 private class MyTest extends ATest{

     @Override
     public makeNewObject(SomeImpClass1 someImpObject1, SomeImpClass2 someImpObject2){
   return someObjectMock;
 }

}

现在您也不需要对其进行监视和 stub ,因为重写方法始终返回您在测试中期望的内容。

关于java - Mockito 无法模拟目标类构造函数中存在的函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48109371/

相关文章:

java - @RunWith(JUnitParamsRunner.class) 和 PowerMockRule

java - @Mock、@MockBean 和 Mockito.mock() 之间的区别

java - 从多个 REST 端点获取 JSON 数据的正确方法

java - 使用 Mock 框架编写单元测试的最佳实践是什么

java - 如何使用 Jersey 2 测试框架为此类编写单元测试

.net - C# 异步。套接字编程

java - 使用 Mockito 模拟接口(interface)

java - 如何停止集群中仅一台服务器上的应用程序?

java - 从处理程序调用时,asynctask 未获取 arraylist

java - 验证后 Fabric 数字在回调中崩溃