不需要的模拟与 mockito

Unwanted mock with mockito

我正在使用 jUnit 5 和 Mockito 进行单元测试。在一次测试中,我不得不模拟一个方法。一切正常。在稍后的另一个测试中,我调用了相同的方法,但这次我不想让 Mockito 做任何事情。然而,Mockito return 是一个未询问的 null 值,这使我的测试失败。 以为是第一次测试的缘故,所以加了Mockito.reset()。但这并没有改变任何东西。

你了解幕后发生的事情吗?

我 运行 调试模式以获得有关 Mockito 创建的对象的更多信息。我可以阅读的其他信息

invocationForStubbing: ecritureComptable.toString();

但是我不知道这个方法是在什么地方,什么时候被调用的。 任何帮助表示赞赏。

编辑.... 谢谢你们。我编辑了我的 post 以使其更清晰,也因为我现在对可能发生的事情有了更好的了解:

1/ 在每次测试之前,我创建一个对象 DaoProxy 的 mock 并使用模式 RETURNS_DEEP_STUBS,它有嵌套在 DaoProxy 中的 mockito mock 对象

  @BeforeAll
    private static void injectMockDao() {
        DaoProxy daoProxyMock = mock(DaoProxy.class, Mockito.RETURNS_DEEP_STUBS);
        AbstractBusinessManager.configure(null, daoProxyMock, null);
    }

2/具体的测试方法,我使用:

when(getDaoProxy().getComptabiliteDao().getEcritureComptableByRef(Mockito.anyString())).thenReturn(ecritureBDD);

并在使用后重置它,跳转到所有链的下一次调用,Mockito 不会做任何事情(但它没有工作):

reset(getDaoProxy().getComptabiliteDao().getEcritureComptableByRef(Mockito.anyString()));

3/ 在稍后的另一个测试中,我打电话给

getDaoProxy().getComptabiliteDao().getEcritureComptableByRef()

Mockito - 尽管未被询问 - return 是一个空对象。

@Gavin 的输入让我假设这是因为 RETURNS_DEEP_STUBS-DaoProxy 的模拟。 Mockito 模拟嵌套对象,但由于它没有关于它应该 return 的信息,它 return 是默认对象值:null。这解释了为什么在这种情况下重置没有帮助。

如果您的对象被标记为使用 @Mock 进行模拟,或者您已经使用 mock 方法创建它,那么 Mockito 将 return 类型的默认值,对于对象是 null.

在失败的测试中,您可以尝试以通常的方式提供模拟值,或者注入被模拟对象的 "real" 实例,我相信 Mockito 可以提供模拟值对对象的 "real" 实例的响应。

如果你想在第二个测试中进行真正的方法调用,那么在第二个测试中使用thenCallRealMethod()

when(mock.someMethod()).thenCallRealMethod();