测试方法外的Mockito桩设定

9
我有一个在测试方法之外的以下方法。
private DynamicBuild getSkippedBuild() {
    DynamicBuild build = mock(DynamicBuild.class);
    when(build.isSkipped()).thenReturn(true);
    return build;
}

但是当我调用这个方法时,我会得到以下错误。
org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at LINE BEING CALLED FROM

E.g. thenReturn() may be missing.
Examples of correct stubbing:
    when(mock.isOk()).thenReturn(true);
    when(mock.isOk()).thenThrow(exception);
    doThrow(exception).when(mock).someVoidMethod();
Hints:
 1. missing thenReturn()
 2. you are trying to stub a final method, you naughty developer!

看起来 Mockito 不支持在测试方法之外进行存根。这是不被支持的吗?

编辑:我可以通过在 @Test 方法中进行存根来使其正常工作,但我想在多个 @Test 中重用这个存根。


1
isSkipped()是一个final方法吗? - spg
1
@Simon-Pierre,那样做是不好的,Surya会生气的。 - toniedzwiedz
@Simon-Pierre 不,这不是一个 final 方法。 - Surya
1
以下答案帮助我摆脱了同样的错误: https://dev59.com/al8d5IYBdhLWcg3w41nz - Mr. Wonderful
1个回答

15
如果 isSkipped()方法不是一个final方法,那么这个问题可能表明您在存根另一个方法的过程中尝试存根方法。这是不支持的,因为Mockito依赖于方法调用的顺序(when()等)来进行存根操作。
我猜您的测试方法中有类似以下的内容:
when(...).thenReturn(getSkippedBuild());
如果是这样,您需要将其重写为以下内容:
DynamicBuild build = getSkippedBuild();
when(...).thenReturn(build);

4
这个信息对你有什么帮助不大吗?它告诉了你有未完成的存根。它告诉了你未完成存根的行号。你还得到了一个堆栈跟踪,显示了实际触发错误的位置(也就是从第二个方法尝试进行存根时,第一个方法的存根尚未完成的堆栈)。当存在未完成的存根时,你还希望Mockito提供什么更多的信息呢? - Dawood ibn Kareem
4
我会尽力为您翻译:@DavidWallace 我在寻找一个缺失的 thenReturn(),就像错误提示一样建议的那样。我希望Mockito能够告诉我内联模拟不起作用。 - Surya
内联Mocking确实有效,但是当您正在模拟其他内容时不起作用; 换句话说,您不能在调用thenReturn时进行更多的Mocking。我认为可以为此区别添加详细说明,但这将使错误消息变得非常冗长。如果您愿意,我可以与Mockito团队讨论是否将更详细的说明添加到Mockito文档中;但将其添加到错误消息中并不是正确的位置。 - Dawood ibn Kareem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接