for*_*ste 8 java mocking mockito
mockito-version:1.9.0
我想在mockito中设置一个模拟对象的方法调用,而不调用原始方法本身:
编辑:这个例子实际上按预期工作,即身体方法"test()"没有被执行.但是,在进一步调查之后,我注意到原始方法有默认的可见性修饰符,我怀疑这会导致问题,因为在将其更改为公共之后(不应该是相同的吗?!)它按预期工作.
例如
public class TestClass {
public String test() {
System.out.println("test called!");
return "test";
}
}
Run Code Online (Sandbox Code Playgroud)
//in test
TestClass mock = mock(TestClass.class);
when(mock.test()).thenReturn("mock!"); //<-- prints test called here? why? how can I switch it off?
Run Code Online (Sandbox Code Playgroud)
下面,1.9.0的Mockito和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!");
}
}
Run Code Online (Sandbox Code Playgroud)
此外,如果我在test()方法中放置一个断点,它永远不会被击中.
也许发布更多代码?看起来您的示例不够复杂,无法证明您遇到问题的行为.
另外:你使用的是最新版的Mockito吗?
如果final向正在模拟的方法添加修改器,则会获得您报告的行为.
这是因为Mockito不会模拟最终和静态方法.相反,它将调用委托给真正的实现.
您的实际代码可能会试图模拟最终方法吗?
如果是这样,您可以使用PowerMock,它是Mockito的扩展,允许模拟最终方法.
您需要将以下注释添加到测试用例类:
@RunWith(PowerMockRunner.class)
@PrepareForTest(TestClass.class)
public class TestNonCall {
// ...
}
Run Code Online (Sandbox Code Playgroud)
并在测试方法中使用PowerMock方法模拟类:
final TestClass mock = PowerMockito.mock(TestClass.class);
Run Code Online (Sandbox Code Playgroud)
然后照常进行.