如何模拟@InjectMocks类的方法?

2022-08-31 11:08:52

例如,我有处理程序:

@Component
public class MyHandler {

  @AutoWired
  private MyDependency myDependency;

  public int someMethod() {
    ...
    return anotherMethod();
  }

  public int anotherMethod() {...}
}

为了测试它,我想写这样的东西:

@RunWith(MockitoJUnitRunner.class}
class MyHandlerTest {

  @InjectMocks
  private MyHandler myHandler;

  @Mock
  private MyDependency myDependency;

  @Test
  public void testSomeMethod() {
    when(myHandler.anotherMethod()).thenReturn(1);
    assertEquals(myHandler.someMethod() == 1);
  }
}

但实际上,每当我试图嘲笑它时,它就会打电话。我该怎么做才能嘲笑它的方法?anotherMethod()myHandler


答案 1

首先,嘲笑MyHandler方法的原因可能如下:我们已经测试并且它具有复杂的逻辑,那么如果我们可以调用它,为什么我们需要再次测试它(就像它的一部分)?
我们可以通过以下方式做到这一点:anotherMethod()someMethod()verify

@RunWith(MockitoJUnitRunner.class)
class MyHandlerTest {

  @Spy  
  @InjectMocks  
  private MyHandler myHandler;  

  @Mock  
  private MyDependency myDependency;  

  @Test  
  public void testSomeMethod() {  
    doReturn(1).when(myHandler).anotherMethod();  
    assertEquals(myHandler.someMethod() == 1);  
    verify(myHandler, times(1)).anotherMethod();  
  }  
}  

注意:在“间谍”对象的情况下,我们需要使用而不是(这里几乎没有解释doReturnthenReturn)


答案 2

上面的所有答案都非常好,可能很有用,所以在继续阅读我的帖子之前,请确保您先学习并理解这些原则。

在我的情况下,上面的建议都没有奏效。在经过相当长的调试后,我将发布对我有帮助的内容。

如果要从测试的类中调用方法,则需要在旁边(或调用或课程)进行注释@Spy@InjectMocksMockito.spy(XXX)

有趣的是,这些注释的顺序确实很重要!批注必须先于批注。@Spy@InjectMocks

将不起作用

...

@InjectMocks
@Spy
private TestedObject instance

...

将工作

...

@Spy
@InjectMocks
private TestedObject instance

...

推荐