我如何模拟 @InjectMocks 类的方法?

新手上路,请多包涵

例如我有处理程序:

 @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 做什么来模拟它的方法?

原文由 Vova Yatsyk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

首先,模拟 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();
  }
}

注意:在“间谍”对象的情况下,我们需要使用 doReturn 而不是 thenReturn这里 没有什么解释)

原文由 Vova Yatsyk 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

在我的场景中,以上建议均无效。经过相当长的调试后,我将发布对我有帮助的内容。

如果你想从测试的类中调用方法, @Spy 注释需要与 @InjectMocks (或 Mockito.spy(XXX) 调用或课程)

有趣的是, 这些注释的顺序很重要@Spy 注释 必须在 @InjectMocks 注释之前。

不管用

...

@InjectMocks
@Spy
private TestedObject instance

...

将工作

...

@Spy
@InjectMocks
private TestedObject instance

...

原文由 Johnczek 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题