【问题标题】:How to mock the method of an object in which mocks are injected如何模拟注入模拟的对象的方法
【发布时间】:2015-10-19 08:10:30
【问题描述】:

我正在使用 mockito 和 testng 为一个类编写测试。要测试的类有几个需要模拟和注入的依赖项。要测试的类具有以下配置文件

class A{
    @Autowired
    private Object1;
    @Autowired
    private Object2;
    Object3 methodToBeTested (){
           //some code
           method2();
           //some code
    }
    boolean method2(){
        //some calls to Database that are not operational
    }
}

在我的测试类中,我将对象 Object1 和 Object2 声明为模拟对象并将它们初始化如下

@Mock
Object1 ob1;
@Mock
Object2 ob2;
@InjectMocks
A a = new A();

@Test
public void ATest(){
     Object3 ob3;
     when(ob1.someMethod()).thenReturn(someObject);
     when(ob2.someMethos()).thenReturn(someOtherObject);
     ob3 = a.methodToBeTested();
     assertNotNull(ob3);
}

出现问题是因为我必须模拟对 A 类的方法 2 的调用,并且它有一些在测试阶段无法运行的调用。此外,mockito 不允许对象同时具有 @Mocks 和 @InjectMocks 注释。有没有办法在不修改 A 类代码的情况下继续测试(不想仅仅为了测试而修改它)。

【问题讨论】:

标签: java testng mockito


【解决方案1】:

您需要监视真实的 A 对象,如 the documentation 中所述:

@Mock
Object1 ob1;

@Mock
Object2 ob2;

@InjectMocks
A a = new A();

@Test
public void ATest(){
    A spy = spy(a);

    doReturn(true).when(spy).method2();

    Object3 ob3;
    when(ob1.someMethod()).thenReturn(someObject);
    when(ob2.someMethos()).thenReturn(someOtherObject);

    ob3 = spy.methodToBeTested();

    assertNotNull(ob3);
}

请注意,这很有可能表明代码有异味。 method2() 可能应该移到另一个类中,A 将依赖它。

【讨论】:

  • 赞成表示代码异味。如果你需要监视,在 99% 的情况下你需要重构你的代码
  • @SarthakNigam 那么您应该接受答案以将您的问题标记为已回答。见meta.stackexchange.com/questions/5234/…
  • 抱歉不知道
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多