我在编写测试用例时使用Mockito来模拟某个类。
有没有办法在返回值之前打印一些语句?像:
when(x.callFunction(10).thenReturn(new String("Hello"));
以上陈述有效,但我无法执行以下操作:
when(x.callFunction(10).thenReturn({
System.out.println("Mock called---going to return hello");
return new String("Hello");});
答案 0 :(得分:5)
使用thenAnswer
,每次调用模拟方法时都可以执行其他操作。
when(x.callFunction(10)).thenAnswer(new Answer<String>() {
public String answer(InvocationOnMock invocation) {
System.out.println("Mock called---going to return hello");
return "Hello";
}
});
答案 1 :(得分:3)
如果您要创建的对象不是final
,那么除了@Roland Weisleder提供的thenAnswer
之外,您可以在thenReturn
中使用带有init块的匿名子类,如下面的示例代码:
class FoobarFactory {
public Foobar buildFoobar() {
return null;
}
}
class Foobar {
private String name;
public Foobar(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
使用模拟代码:
@Test
public void testFoobar() throws Exception {
FoobarFactory foobarFactory = mock(FoobarFactory.class);
when(foobarFactory.buildFoobar()).thenReturn(new Foobar("somename") {
{
System.out.println("Creating mocked Foobar");
}
});
Foobar foobar = foobarFactory.buildFoobar();
assertThat(foobar.getName(), is("somename"));
}
答案 2 :(得分:2)
我喜欢其他答案,但鉴于您的最新评论:
我将在最后的代码中使用thenReturn。这更像是测试我的测试代码并检查我的模拟函数是否被调用!
我对你有另一个想法:不要回电/打印那个电话;改为使用thenThrow()
!
重点是:控制台中的print语句有时很有用;但它们很容易被忽视。如果整个目的是确保在某个模拟上发生某个调用;然后只是抛出一个异常而不是返回一个值。因为JUnit会给你直接且难以忽视的反馈;通过测试用例失败。
你甚至可以更进一步,在测试中提出@expected - 这样你就有了一个方法来自动测试这个方面 - 如果没有调用mock;没有例外;测试将失败。