mockito-version:1.9.0
我想在mockito中设置一个模拟对象方法的调用而不调用原始方法本身:
编辑:此示例实际上按预期工作,即未执行的正文方法“test()”。但是,在进一步调查之后,我注意到原始方法有默认的可见性修饰符,我怀疑这会导致问题,因为在将它更改为公开之后(不应该是相同的吗?!)它按预期工作。
e.g。
public class TestClass {
public String test() {
System.out.println("test called!");
return "test";
}
}
//in test
TestClass mock = mock(TestClass.class);
when(mock.test()).thenReturn("mock!"); //<-- prints test called here? why? how can I switch it off?
答案 0 :(得分:7)
以下操作在Mockito 1.9.0和JUnit 4.8.2下运行,不在我的控制台上打印任何内容:
import static org.mockito.Mockito.*;
import org.junit.Test;
public class TestNonCall {
public class TestClass {
public String test() {
System.out.println("test called!");
return "test";
}
}
@Test
public void doTest() {
final TestClass mock = mock(TestClass.class);
when(mock.test()).thenReturn("mock!");
}
}
此外,如果我在test()方法中放置一个断点,它就永远不会被击中。
也许发布更多代码?看起来你的例子不够复杂,无法证明你遇到问题的行为。
另外:你使用的是最新版的Mockito吗?
如果您向正在模拟的方法添加final
修饰符,则会获得您报告的行为。
这是因为Mockito不会模拟最终和静态方法。相反,它将调用委托给真正的实现。
您的实际代码可能会试图模拟最终方法吗?
如果是这样,您可以使用PowerMock,这是Mockito的扩展,允许模拟最终方法。
您需要将以下注释添加到测试用例类中:
@RunWith(PowerMockRunner.class)
@PrepareForTest(TestClass.class)
public class TestNonCall {
// ...
}
在测试方法中使用PowerMock方法模拟类:
final TestClass mock = PowerMockito.mock(TestClass.class);
然后照常进行。