我是Mockito的新手,并认为它是嘲笑的摇滚乐。我刚刚遇到一个案例,似乎我无法让它工作 - 就是用模拟方法替换普通对象的方法, 没有 当我尝试模拟它时调用的方法。
这是我正在尝试做的一个超级简化示例,遗憾的是,它不会复制错误,但似乎与我的真实代码完全相同。
public class SimpleTest
{
public class A
{
}
public class B
{
public int getResult(A anObj)
{
throw new RuntimeException("big problem");
}
}
@Test
public void testEz()
{
B b = new B();
B spy = spy(b);
// Here are both of my attempts at mocking the "getResult" method. Both
// fail, and throw the exception automatically.
// Attempt 1: Fails with exception
//when(spy.getResult((A)anyObject())).thenReturn(10);
// Attempt 2: In my real code, fails with exception from getResult method
// when doReturn is called. In this simplified example code, it doesn't ;-(
doReturn(10).when(spy).getResult(null);
int r = spy.getResult(null);
assert(r == 10);
}
}
所以目前当我运行测试时,当我尝试嘲笑间谍的“getResult”方法时,测试失败了。异常是我自己的代码(即运行时异常)的异常,它发生在我尝试模拟“getResult”方法=即执行上面的“doReturn”行时。
请注意,我的实际用例当然更复杂......“B”类有许多其他方法我想保留原样,只是模拟一种方法。
所以我的问题是如何模拟它以便不调用该方法?
主要注意:我刚从头开始重写整个测试,现在工作正常。我确定我的某个地方有一个错误,但它现在不存在 - 当使用间谍嘲笑时,该方法不被调用!为了它的价值,我在模拟方法时使用了doReturn语法。
doReturn(10).when(spy).getResult(null);
答案 0 :(得分:1)
您的reedited问题现在运作得很好。
此注释行错误
when(spy.getResult((A)anyObject())).thenReturn(10);
应该是
when(spy.getResult(any(A.class))).thenReturn(10);
public class SimpleTest {
public class A {
}
public class B {
public int getResult(A anObj) {
throw new RuntimeException("big problem");
}
}
@Test
public void testEz() throws Exception {
B b = new B();
B spy = spy(b);
doReturn(10).when(spy).getResult(null);
int r = spy.getResult(null);
assert (r == 10);
}
}
Tests Passed: 1 passed in 0,176 s