Mockito将模拟标记为已验证,即使它们未验证

7eumitmz  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(163)

我在JUnit 5测试结束时使用Mockito.verifiynoMoreInteractions(mock 1,mock 2,...)。我最近意识到,它不会在最后显示尚未验证的模拟,因为我只是忘记调用verify()。
我调试了代码,并使用Mockito.mockingDetails(mock).getInvocations()向我展示了对该mock的所有调用。令我惊讶的是,每当在mock上调用一个方法时,都会向列表中添加一个调用,但是字段“verified”设置为true,这反过来又使它在调用verifyNoMoreInteractions()时不会显示。
我希望所有调用都必须通过显式的verify()调用进行验证。
我是不是理解错了,还是问题出在莫奇托那边?
谢谢大家!
更新:
Testclass im using(测试运行绿色即使它不应该):

@ExtendWith(MockitoExtension.class)
class UserManagerTest {

    UserManager userManager;

    @Mock
    DataNetworkPlugin dataNetworkPlugin;

    @Mock
    Source source;

    @BeforeEach
    void setUp() {
        initializeTest();
    }

    @AfterEach
    void tearDown() {
        verifyNoMoreInteractions(source, dataNetworkPlugin);
    }

    @Test
    void test() {
        System.out.println("test");
    }

    private void initializeTest() {         
        when(dataNetworkPlugin.getElement(anyString())).thenReturn(source);
        when(source.asDataSource()).thenReturn(null);

        userManager = UserManager.createInstance(dataNetworkPlugin);
    }
}

dataNetworkPlugin.getElement(“”)和source.asDataSource()都在UserManager.createInstance()中调用。
更新2:
如果我把我的tearDown方法改为下面的方法,它仍然有效。Mockito并没有告诉我我验证得太多了。

@AfterEach
void tearDown() {
    verify(source).asDataSource();
    verify(dataNetworkPlugin).getElement();
    verifyNoMoreInteractions(source, dataNetworkPlugin);
}
xwbd5t1u

xwbd5t1u1#

偶然发现了同样的问题,但实际上这似乎是JUnit 5中的预期行为。
声明基于引用此报价:
[...]您只需要记住,显式存根化的方法调用是自动验证的。您可能通常需要验证没有副作用的相互作用,例如void方法。最后,代码更少,但最终结果相似-只是从junit 4迁移时一开始就令人困惑。
来源:https://github.com/mockito/mockito/issues/1610#issuecomment-758975695

相关问题