检查异常对此方法无效

checked exception is invalid for this method

我有以下class Whosebug 中对此有一个答案,但它处理列表 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 块,因此编写了以下测试方法。它抛出以下异常。找不到我想念的地方。

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 消息。

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

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

模拟 正在测试的 class 没有 没有 !

当您 mock class 时,您会得到一个 stub,其中包含 "nothing to do" 与您的实际实现. "working setup" 看起来更像:

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); ...

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

但如前所述:模拟您要测试的 class 没有任何意义。因为模拟对象对 "real" 实现一无所知!

操纵环境,使 "doesSomething()" 抛出您想要的异常。由于我们不知道 "doesSomething()" 真正做什么,所以不能多说。