假设我有一个测试类,有两个方法如下:
public class TestClass {
@Mock
TestClass testObject;
@Test
public void method1() {
doReturn("str").when(testObject).method2();
String s1 = testObject.method2(); // This line gives compilation
//error. Type mismatch cannot convert from void to string
}
@Test
public void method2() {
}
我基本上是在尝试模拟 method1 ,这是 method1 中的依赖项。
但是正如您所看到的, method2 返回类型为void。所以,我正在使用 doReturn 来模拟它。
就我的理解而言,虽然方法2的返回类型为void,但在我模拟它之后,方法2的模拟版本应该返回 String 类型。
但是,正如我在方法1中所评论的那样,它给出了类型不匹配。
答案 0 :(得分:3)
你只是让嘲笑错了。
模拟意味着:不是创建特定类的“真实”对象,而是创建一个看起来的存根/虚拟/模拟,就像该类的对象一样。但实际上 - 事实并非如此。
除此之外:嘲笑不能更改方法的签名。所以你的想法,你可以以某种方式使用mocking有一个void方法返回的东西错误。
你只是走错了兔子洞 - 你打算做什么不可能。
答案 1 :(得分:0)
我认为你使用的是错误的方法。 doReturn
允许您“注入”执行结果。如果您想“伪造”整个方法执行,您应该考虑使用doAnswer
:
doAnswer(new Answer<Void>() {
public Void answer(InvocationOnMock invocation) {
// whatever you want to execute here...
// Simply return null
return null;
}
}).when(testObject).method2();