Java 是否有一些方法可以';如果mock上没有调用该方法,Mockito不会对其进行模拟吗?
我对Mockito是个新手,我觉得它很适合嘲笑。我刚刚遇到一种情况,我似乎无法让它工作——用模拟方法替换普通对象的方法,,而当我试图模拟它时,没有调用该方法 下面是一个超级简化的示例,说明了我正在尝试做的事情,遗憾的是,它没有复制错误,但似乎与我的真实代码完全相同Java 是否有一些方法可以';如果mock上没有调用该方法,Mockito不会对其进行模拟吗?,java,unit-testing,mockito,Java,Unit Testing,Mockito,我对Mockito是个新手,我觉得它很适合嘲笑。我刚刚遇到一种情况,我似乎无法让它工作——用模拟方法替换普通对象的方法,,而当我试图模拟它时,没有调用该方法 下面是一个超级简化的示例,说明了我正在尝试做的事情,遗憾的是,它没有复制错误,但似乎与我的真实代码完全相同 public class SimpleTest { public class A { } public class B { public int getResult(A anObj
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);
}
}
因此,当前当我运行测试时,当我尝试并模拟spy的“getResult”方法时,由于抛出异常,测试失败。该异常是来自我自己代码的异常(即运行时异常),当我在执行上面的“doReturn”行时尝试并模拟“getResult”方法=ie时,就会发生该异常
请注意,我的实际用例当然更复杂。。。“B”类还有很多其他的方法,我想让它们保持原样,只是模仿一个方法
那么我的问题是如何模拟它,从而不调用该方法?
主要提示:我刚刚从头重写了整个测试,现在一切正常。我确信我在他们的某处有一个bug,但现在它不在那里了——当使用间谍模拟方法时,不会调用该方法!值得一提的是,我在模拟这个方法时使用了doReturn语法
doReturn(10).when(spy).getResult(null);
您重新编辑的问题现在效果很好。 这一行是错误的
when(spy.getResult((A)anyObject())).thenReturn(10);
应该是
when(spy.getResult(any(A.class))).thenReturn(10);
完全测试(未调用方法)
结果
嘿这个测试要复杂得多,而且有很多领域特定的东西。。。但失败的核心是那两行“when…”和“doReturn…”行。。。但根据您的经验,是否有任何方法无法监视,因为当您试图模拟该方法时,该方法正在引发异常?当出现时,带有
的行肯定会引发异常。但是带有doReturn
的行应该可以正常工作。这是正确的做事方式。你确定这个方法不是final
之类的吗?另外,这是getResult
的唯一实现吗?@BradParks不,也许您应该添加在不起作用时获得的stacktrace。我还要确保测试中使用了间谍(b
,而不是a
),谢谢您的反馈。我将我的伪代码更新为真实代码,它可以工作。我的mock方法不是final,但它有一个@Context arg。这是签名:public Response getResult(@Context-HttpServletRequest)。请注意,我在模拟和调用该方法时传递null。伪代码可以正常工作,添加真实代码:)请停止编辑此文章,因为我的答案是第一个版本:)彻底的更改需要新的问题。
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