检查的异常对此方法无效

Saw*_*yer 3 java junit mockito powermockito

我有下面的类在StackOverflow中有一个答案,但是它处理了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);
           }

      }
Run Code Online (Sandbox Code Playgroud)

我的测试方法如下所示。我尝试使用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());
      }
   }
Run Code Online (Sandbox Code Playgroud)

抛出异常

   org.mockito.exceptions.base.MockitoException: 
   Checked exception is invalid for this method!
   Invalid: java.lang.Exception
Run Code Online (Sandbox Code Playgroud)

编辑

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

Gho*_*ica 6

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

SimpleClass instanceObj =PowerMockito.mock(SimpleClass.class);
Run Code Online (Sandbox Code Playgroud)

没有在嘲笑的类,它是点测试

当你嘲笑这个类,你会得到一个存根具有“无关”你真正的实现。“工作设置”看起来更像是:

public void methodUnderTest(X x, ...) {
   try { 
     x.foo(); 
   } catch (Exception e) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

 underTest.methodUnderTest(mockedX); ...
Run Code Online (Sandbox Code Playgroud)

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

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