【问题标题】:checked exception is invalid for this method [duplicate]检查的异常对此方法无效[重复]
【发布时间】:2017-08-24 13:28:45
【问题描述】:

我有以下课程 StackOverflow 中有一个答案,但它处理列表throw checked Exceptions from mocks with Mockito。我喜欢研究这种情况。没有找到我想念的地方。

public SimpleClass{                                                         
    private SimpleClass() {}                                                    
    public void runMethod(request,String,Map,Object,Object) {                   
        try {                                                                  
            doesSomething()....                                                
        }                                                                      
    }                                                                          
    catch(Exception e) {                                                        
        String message = "" + request.getAttribute(X) + "Some message";        
        Logger.Log(param1 + param2 + message);                                 
    }                                                                          
}

我的测试方法如下所示。我试图用 JUnit 运行覆盖但 Catch Block 没有被覆盖,所以写了下面的测试方法。它引发以下异常。无法到达我想念的地方。

public class SimpleClassTest{                                               
    @Test                                                                   
    public void testCatchBlock() {                                           
        SimpleClass instanceObj = PowerMockito.mock(SimpleClass.class);     
        Mockito.doThrow(new Exception())                                    
                .when(instanceObj)                                           
                .runMethod(request, anyString(), anyMap(), anyObject(), anyObject());
    }                                                                       
}

抛出异常

org.mockito.exceptions.base.MockitoException: 
Checked exception is invalid for this method!
Invalid: java.lang.Exception

编辑

我可以通过给出 NullPointerException 来运行该方法。当我尝试使用 Junit 进行代码覆盖时,catch 块完全显示为红色,catch 短语显示为黄色。如何实现 100% 的覆盖率以及如何在 catch 块中测试 String 消息。

【问题讨论】:

  • 我已经尝试过,但无法得到我所缺少的。
  • @Sawyer 代码 sn-p 不完整,但我建议再次查看您的存根。
  • 我无法实现 Catch 块中字符串的覆盖和测试。我该怎么做。
  • 简单问题:SimpleClass.firec2TEvents 的声明中有 throws Exception 吗?如果不是,那么它可能不会抛出 Exception,因为 Exception 是一个已检查的异常。如果你想测试那个 catch 块,你应该让它抛出一个RuntimeException——或者任何声明的检查异常。这就是失败告诉你的:你正试图抛出一个检查异常,但是有问题的方法没有声明抛出这个检查异常,所以你不允许抛出那个检查异常。
  • 感谢及时回归 ;-)

标签: java junit mockito powermockito


【解决方案1】:

您正在通过模拟错误进行单元测试。这里:

SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);

模拟正在测试的类没有点!

当您模拟该类时,您会得到一个与您的实际实现“无关”的存根。 “工作设置”看起来更像:

public void methodUnderTest(X x, ...) {
   try { 
     x.foo(); 
   } catch (Exception e) {
    ...
}

 X mockedX = mock(X.class);
 when(x.foo()).thenThrow(new WhateverException());

 underTest.methodUnderTest(mockedX); ...

然后您可以尝试验证,例如记录器是否看到了预期的记录调用。换句话说:您要么使用一个模拟来允许你的被测代码完成它的工作(处于控制之中!)要么验证 在模拟对象上发生了一些预期的调用。

但如前所述:模拟您要测试的那个类没有任何意义。因为模拟对象对“真实”实现一无所知!

【讨论】:

  • 如何验证catch的内容,能否给个提示?
  • 视情况而定。如果Logger.log() 是一个静态 调用...您可以 使用PowerMock(ito) 或JMockit 来验证 是否发生了日志调用。我个人不喜欢模拟静态调用,或者,您可以: 将某个日志接口的 instance 作为成员放入该生产类。然后:您可以使用 dependency injection 来提供 mocked 记录器对象。然后您可以再次verify 调用。好的……那又是 5 分钟 ;-)
  • +1 为您提供上述信息,并支持答案,以提供一些关于模拟发生的情况和假设的知识。我通过在 Simple 类上的 InjectMocks 并使用此方法参数的未初始化对象调用 runMethod() 实现了覆盖。不过,您可以编辑答案,正如您对 verfiy 所说的那样。
  • 不客气,但我必须承认:我没有得到你想要告诉我的内容。无论如何,我更新了我的答案......
【解决方案2】:

操纵环境,使“doesSomething()”抛出你想要的异常。由于我们不知道“doesSomething()”到底是做什么的,所以不能多说。

【讨论】:

  • 我知道你想要得到什么,基本上 mockito 不允许抛出任何异常,除了在方法签名中声明的异常。所以,要回答这个问题,我们需要 doSomething() 的签名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多