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