【发布时间】:2018-08-16 14:41:49
【问题描述】:
我有一个测试,希望在发现用户被挂起时引发异常。
@Test(expected = SuspendedException.class)
public void testGetUserKeychain_WhenOneUserSuspended_ShouldThrowSuspended() throws Throwable {
when(userKeychain.getUserStatus()).thenReturn(UserState.OK);
when(otherUserKeychain.getUserStatus()).thenReturn(UserState.SUSPENDED);
when(keyLookup.lookupKeychainsByUserId(any()))
.thenReturn(CompletableFuture.completedFuture(ImmutableMap.copyOf(multiUserKeychains)));
try {
padlockUtil.getKeychains(
Sets.newSet("userid", "otheruserid")).toCompletableFuture().get();
} catch (ExecutionException e) {
throw e.getCause();
}
}
但我得到的例外是:
org.mockito.exceptions.misusing.UnnecessaryStubbingException:
Unnecessary stubbings detected in test class: PadlockUtilTest
Clean & maintainable test code requires zero unnecessary code.
Following stubbings are unnecessary (click to navigate to relevant line of code):
1. -> at com.xyz.server.padlock.PadlockUtilTest.testGetUserKeychain_WhenOneUserSuspended_ShouldThrowSuspended(PadlockUtilTest.java:119)
Please remove unnecessary stubbings or use 'lenient' strictness. More info: javadoc for UnnecessaryStubbingException class.
我相信这是因为在PadlockUtil::getKeychains 中,暂停的用户在 OK 用户之前遇到,所以 Mockito 抱怨 OK 用户不需要被存根。
因为如果我交换谁被停职而不是……
when(userKeychain.getUserStatus()).thenReturn(UserState.SUSPENDED);
when(otherUserKeychain.getUserStatus()).thenReturn(UserState.OK);
...然后Mockito很高兴。而不是仅仅切换"userid"和"otheruserid";那里Mockito仍然不高兴,大概是因为那不是后来确定顺序的地方。
在我设置的这个特定示例中,可能没有必要存根第一个用户。但这在未来可能会产生误导;我希望存根存在,这不是因为“宽容”,IMO。我也可以暂停第一个用户而不是第二个用户,但它没有明确解决这个微妙之处,而且它可能会在以后再次出现,让开发人员感到困惑。
这样做的正确方法是什么,这样底层的操作顺序(我们在这里处理集合和映射,仅此而已)不是测试中的一个因素?
【问题讨论】:
-
你应该发布测试代码的相关部分。
标签: java exception java-8 mockito