Java Mockito异常:尝试测试if条件时缺少方法调用
我试图使用when()、thenReturn()测试if条件,但当我运行测试用例时,它会给我缺少的方法调用,即使我模拟了实现该方法的类 这就是我试图模拟的if条件Java Mockito异常:尝试测试if条件时缺少方法调用,java,unit-testing,exception,junit,mockito,Java,Unit Testing,Exception,Junit,Mockito,我试图使用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 { par
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注释模拟了“request”,但仍然得到下面的异常
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)
我不确定我做错了什么。有人能帮忙吗?我不能写评论,这就是为什么在这里问的原因。“请求”是什么样的对象?如果它是最后一个类的对象,那么您需要PowerMockito来模拟它 另外,在使用@Mock annotation之后,您是否在运行测试用例之前调用了
MockitoAnnotations.initMocks(testClass.class)
方法
下面的链接介绍了模拟对象的不同方式。
这里的第三行是“太晚了”。在调用剪切之前,必须配置模拟
它仍然不能解决我的问题
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
在测试中:
when(TagAccessorFactory.getInstance()).thenReturn(tagAccessorFactoryMock);
不能用这种方式模拟静态方法,必须使用PowerMockitoswhen()
method
但是(再一次)我认为使用PowerMockito是对糟糕设计的一种屈服。您不应该使用静态访问来获取依赖项,而应该使用DI(手动或最好使用DI框架)将它们传递到类中
当我打电话给
when(request.getProcessType()).thenReturn(IPRequest.IPREQUEST_TYPE_TOMO_RECON);
在方法调用之前,我得到如下异常
Wanted but not invoked:"
您尝试使用相同的测试方法测试这两个执行路径
您应该有单独的测试方法“request”是一个公共类的对象,我使用@Mock模拟了该类。如果我调用MockitoAnnotations.initMocks(),我会得到空指针异常,因此我忽略了它。我认为存在一些问题,您的mock没有被注入到类中。你有没有试着在没有注释的情况下模仿它?通过使用
Request-Request=mock(Request.class)
。PS-如果未注释的模拟也不起作用,那么您应该首先尝试解决NullPointerException。是的,我也尝试过在没有注释的情况下模拟它,但它不起作用,相反,我得到了一个异常,如需要但未调用:iPImgParams.setTubeAngle();->然而,在common.systemreprocessingservice.test.ImageParamsBuilderTest.TestBuildProcessingInfo(ImageParamsBuilderTest.java:137)上,与此mock:->在common.systemreprocessingservice.ImageParamsBuilder.buildProcessingInfo(ImageParamsBuilder.java:34)上存在其他交互
您如何在测试用例中传递此请求对象?我的意思是,你如何确保方法getProcessType()只在这个模拟对象上被调用,而不是在你测试的类中创建的其他对象上被调用?你可以参考这个链接:TagAccessorFactory是一个单例类,因此我必须使用PowerMockitos@hushie“TagAccessorFactory是一个单例类”这是您的代码吗(或者至少是你的公司)?这是我的代码。但问题并不是因为这个。当我调用时(request.getProcessType())。然后返回(IPRequest.IPRequest\u TYPE\u TOMO\u RECON);
在方法调用之前,我得到了这样的异常想要但没有调用:iPImgParams.setTubeAngle();->在common.systemreproductingservice.test.ImageParamsBuilderTest.测试构建处理InfoIf(ImageParamsBu但是,在common.systemreproductingservice.ImageParamsBuilder.buildPro上还有其他与这个mock:->的交互cessingInfo(ImagePar)amsBuilder.java:34)
Wanted but not invoked:"