有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带mockito的java模拟

我正在用JUnit5和Mockito进行单元测试。在一次测试中,我不得不模仿一种方法。一切正常。在稍后的另一个测试中,我调用了相同的方法,但这次我不想让Mockito做任何事情。然而,Mockito返回一个未请求的null值,这使我的测试失败。 我认为这是因为第一次测试,所以我添加了Mockito.reset()。但这并没有改变任何事情

你知道幕后发生了什么吗

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

invocationForStubbing: ecritureComptable.toString();

但是我不知道在哪里和什么时候调用这个方法。 谢谢你的帮助

编辑。。。。 谢谢你们。我编辑我的帖子是为了让它更清晰,也是因为我现在对可能发生的事情有了更好的了解:

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

  @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);

并在使用后将其重置,在下一次调用all-chain时,Mockito不会做任何事情(但它不工作):

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

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

getDaoProxy().getComptabiliteDao().getEcritureComptableByRef()

Mockito-尽管未被请求-返回空对象

@Gavin的输入使我认为这是因为DaoProxy的返回\u DEEP\u STUBS-mock。Mockito模拟嵌套对象,但是由于它没有关于应该返回什么的信息,所以它返回默认的对象值:null。这就解释了为什么在这种情况下重置没有帮助


共 (2) 个答案

  1. # 1 楼答案

    如果您想在第二个测试中进行实方法调用,那么在第二个测试中使用thenCallRealMethod()

    when(mock.someMethod()).thenCallRealMethod();
    
  2. # 2 楼答案

    如果您的对象被标记为使用@Mock进行模拟,或者您使用了mock方法来创建它,那么Mockito将返回类型的默认值,对象的默认值为null

    在失败的测试中,您可以尝试以通常的方式提供模拟值,或者注入被模拟对象的“真实”实例,我相信有可能让Mockito在对象的“真实”实例上提供模拟响应