Mockito异常:尝试测试if条件时缺少方法调用

时间:2017-02-22 05:31:16

标签: 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    
      {
        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)

我不确定我做错了什么。有人可以帮忙吗?

2 个答案:

答案 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.IPREQUES‌​‌​T_TYPE_TOMO_RECON)‌​; 
     在方法调用之前

我得到了像这样的异常

Wanted but not invoked:" 

您尝试使用相同的测试方法测试两个执行路径。

您应该有单独的测试方法