我正在测试一个类TestObject
。在这个类中,有一个void返回函数stageOne(String)
,我想测试它。在stageOne
的末尾,有一个对另一个void返回函数stageTwo(String)
的调用。我想伪造stageTwo
的响应,这样stageTwo
就永远不会被实际调用。为了通过测试,TestObject
需要准确地调用stageTwo
一次。
我使用when...thenReturn
尝试了很多方法,但都无法正常工作。以下是我目前的最佳猜测。
class TestClass {
private TestObject testObject;
@Before
public static void setUp() {
testObject = new TestObject();
}
@Test
public void test1() {
when(testObject.stageTwo(any(String.class))).thenReturn(Void);
testObject.stageOne("Test data");
verify(testObject, times(1)).stageTwo(any(String.class));
}
}
我正在使用IntelliJ,并且能够进行其他测试,但我根本无法使when...then
构造工作。在上面的例子中,IntelliJ建议我把它变成一个局部变量OngoingStubbing<Void> voidOngoingStubbing
,然后它说这也是错误的。
我也试过
doNothing().when(testObject.stageTwo(any(String.class)));
但这也不起作用。intelliJ使用与以前相同的消息在when()
的内容下加下划线。
编辑:下面的测试对象结构:
public class TestObject {
public void stageOne(String str) {
String str2 = ...
// do stuff
stageTwo(str2) // don't proceed with this method, but verify that it was called
}
public void stageTwo(String str) {
// do stuff which I don't want to do in this test
// e.g. calls to external services and other complexities
}
}
您可以使用部分mock,就像这里的例子一样。不过,请确保首先将对象创建为mock。
TestObject testObject = mock(TestObject.class);
doNothing().when(testObject.stageTwo(anyString()));
when(testObject.stageOne(anyString())).thenCallRealMethod();
如果把代码分成两个方法是值得的,那么最好考虑重构代码。例如,如果代码调用对象并只运行第一个方法是合理的,那么从第一个方法中删除对stageTwo的调用,并强制调用代码同时调用stageOne
和stageTwo
。或者,让stageOne
返回它的字符串,并编写第三个方法来调用所有阶段:
public void allStages(String str) {
String str2 = stageOne(str);
stageTwo(str2);
}
这很好地分解了您的方法,并允许您单独测试它们。目前的设置方式是,这两种方法之间有太多的耦合,所以如果你真的想让它们分开,你应该考虑这样的事情。