当前位置: 首页 > 知识库问答 >
问题:

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

夏建弼
2023-03-14

我试图测试一个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 annotation模拟了“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)

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

共有2个答案

羊舌承颜
2023-03-14
   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));

这里的第三行是“太晚了”。在调用剪切之前,必须配置模拟。

它仍然不能解决我的问题

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.IPREQUES‌​‌​T_TYPE_TOMO_RECON)‌​; 

在方法调用之前,我得到了这样的异常

Wanted but not invoked:" 

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

你应该有单独的测试方法

公良渝
2023-03-14

我不能写评论,这就是为什么在这里问。“请求”是什么样的对象?如果它是最后一个类的对象,那么需要PowerMockito来模拟它。

另外,在使用@Mock注释之后,您是否在运行测试用例之前调用了MockitoAnnotations.initMocks(testClass.class)方法?

下面的链接介绍了模拟对象的不同方式。https://blog.frankel.ch/initializing-your-mockito-mocks/#gsc.tab=0

 类似资料:
  • 我有一个返回类型为的方法。它还可以抛出许多异常,所以我想测试一下那些被抛出的异常。所有尝试都失败了,原因相同: 类型Stubber中的(T)不适用于参数(void)时的方法 有什么想法,我可以如何获得方法抛出一个指定的异常?

  • 我应该如何测试异常?我可以mock connector并且我可以赋予它抛出异常的行为,但是我不明白下一步该怎么做。

  • 我已经使用Groovy几年了,但不是在最近几个月,所以这可能只是一个新手问题。我试图解析日志文件,但当我尝试这样做时: 我得到了这个例外: 线程“main”groovy.lang.missingmethodException中的异常:方法:java.text.SimpleDateFormat.parse()的签名不适用于参数类型:(java.lang.string,ce.readscript.tm

  • 问题内容: 我有一个带有返回类型的方法。它还可以引发许多异常,因此我想测试所引发的异常。所有尝试均以相同的原因失败: Stubber类型中的when(T)方法不适用于参数(void) 有什么想法可以获取引发指定异常的方法吗? 问题答案: 括号放置不正确。 您需要使用: 而 不是 使用: 在文档中对此进行了解释

  • 我在尝试从SOAPUI调用服务时遇到以下异常。当我在浏览器中打开endpoint时,它会显示wsdl fine。 我的wsdl在was 7服务器中 我在中的Soap请求: 肥皂UI中的肥皂反应: 这就是我配置jaxws:endpoint的方式

  • 我有一个简单的类,它基于一个简单的规则构建一个。 如果在数据库中找到,则使用该元数据生成消息 这是这门课和一个斯波克测试。测试失败时,出现,表示无法找到使用该服务创建的。 我真的很想理解为什么这不起作用。我非常感谢在成功测试这项测试中得到的任何帮助。非常感谢。