我正在尝试使用when(),thenReturn()测试if条件,但是当我运行我的测试用例时,它会让我丢失方法调用,即使我已经模拟了实现该方法的类。
这是我试图模仿的if条件
if(request.getProcessType() == IPRequest.IPREQUEST_TYPE_TOMO_RECON)//IPREQUEST_TYPE_TOMO_RECON=9, this is the condition I am trying to test
{
params.setTubeAngle(accessor); //I am verifying if these methods are invoked
params.setTomoFocalSpot(accessor);
}
我正在检查if条件
when(request.getProcessType()).thenReturn(IPRequest.IPREQUEST_TYPE_TOMO_RECON);
Mockito.verify(ipImgParam,Mockito.times(3)).setTubeAngle(Mockito.any(AttributeExtractor.class));
我已经使用@Mock注释模拟了“请求”,但仍然得到以下异常。
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
2. inside when() you don't call method on mock but on some other object.
3. the parent of the mocked class is not public.
It is a limitation of the mock engine.
at common.systemreprocessingservice.test.ImageParamsBuilderTest.testbuildProcessingInfoIf(ImageParamsBuilderTest.java:134)
我不确定我做错了什么。有人可以帮忙吗?
答案 0 :(得分:3)
我不能写评论,这就是为什么在这里问。什么样的对象是"请求"?如果它是最终类的对象,那么你需要PowerMockito来嘲笑它。
此外,使用@Mock注释后,您是否在运行测试用例之前调用了MockitoAnnotations.initMocks(testClass.class)
方法?
以下链接说明了模拟对象的不同方法。 https://blog.frankel.ch/initializing-your-mockito-mocks/#gsc.tab=0
答案 1 :(得分:1)
imageParamsBuilder.buildProcessingInfo(request, info); Mockito.verify(ipImgParam, Mockito.times(3)).fillYourSelf(Mockito.any(AttributeExtractor.class)); when(request.getProcessType()).thenReturn(IPRequest.IPREQUEST_TYPE_TOMO_RECON); Mockito.verify(ipImgParam,Mockito.times(3)).setTubeAngle(Mockito.any(AttributeExtractor.class));
这里的第三行是“为时已晚”。您必须在调用CuT之前配置模拟。
它仍然无法解决我的问题
org.mockito.exceptions.misusing.MissingMethodInvocationException: when() requires an argument which has to be 'a method call on a mock'.
在测试中:
when(TagAccessorFactory.getInstance()).thenReturn(tagAccessorFactoryMock);
你不能以这种方式模拟静态方法,你必须使用 PowerMockito 的when()
方法。
但是(再一次)我认为使用 PowerMockito 作为对糟糕设计的投降。您不应该使用静态访问来获取依赖关系,而是使用DI将它们传递到您的类中(手动或使用DI框架优先)。
我打电话给
在方法调用之前when(request.getProcessType()).thenReturn(IPRequest.IPREQUEST_TYPE_TOMO_RECON);
我得到了像这样的异常
Wanted but not invoked:"
您尝试使用相同的测试方法测试两个执行路径。
您应该有单独的测试方法