【发布时间】:2019-07-15 20:49:43
【问题描述】:
假设我有 3 个类,ClassA 包含一个 ClassB,其中包含一个 ClassC。 我正在尝试测试 ClassA 内部的一个方法,该方法需要调用 ClassB 来获取 ClassC 的实例并在 ClassC 内部执行一个 VOID 方法(我知道这个错误,因为 ClassA 不应该知道 ClassC,代码异味,这是不是我的代码,只是试图创建一个测试)。 但是,当我尝试使用 Mockito.doNothing 跳过该方法调用时,我收到以下错误:
org.mockito.exceptions.misusing.UnfinishedStubbingException:
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!
3: you are stubbing the behaviour of another mock inside before 'thenReturn' instruction if completed
代码如下:
A 类:
public class ClassA {
private ClassB classB;
public ClassA(ClassB classB) {
this.classB = classB;
}
public void methodToTest() {
classB.getClassC().someVoidMethod("123");
}
}
B 类:
public class ClassB {
private ClassC classC;
public ClassB(ClassC classC) {
this.classC = classC;
}
public ClassC getClassC() {
return classC;
}
}
C类:
public class ClassC {
public void someVoidMethod(String arg) {
System.out.println(arg);
}
}
测试类
@RunWith(MockitoJUnitRunner.class)
public class ClassATest {
@InjectMocks
private ClassA classA;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private ClassB classB;
@Mock
private ClassC classC;
@Test
public void test() {
Mockito.doNothing().when(classB.getClassC()).someVoidMethod("123");
}
}
再一次,这段代码不是我的,所以我不能修改它使用依赖项的方式。我只是想测试一下。
快速说明: Mockito.when(...).thenReturn(...) 工作正常,但这不是我的情况,因为我试图模拟的方法是无效的。
【问题讨论】:
-
在你的 C 模拟上存根 someVoidMethod 来做你想做的任何事情。然后在 B 的模拟上存根 getClassC,以返回 C 的模拟。
-
不太确定这是否是您所说的,但添加了 Mockito.when(classB.getClassC()).thenReturn(classC);在调用 Mockito.doNorthing() 之前,但仍然是相同的异常
-
不,这不是我说要做的。好的,以后有时间我会回复的。
标签: java unit-testing mockito