Java Mockito异常:尝试测试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

我试图使用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注释模拟了“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);
不能用这种方式模拟静态方法,必须使用PowerMockitos
when()
method

但是(再一次)我认为使用PowerMockito是对糟糕设计的一种屈服。您不应该使用静态访问来获取依赖项,而应该使用DI(手动或最好使用DI框架)将它们传递到类中


当我打电话给

when(request.getProcessType()).thenReturn(IPRequest.IPREQUES‌​‌​T_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:"