已检查的异常对此方法无效

时间:2017-08-24 13:28:46

标签: java junit mockito powermockito

我有以下课程 StackOverflow中有一个答案,但它处理List 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消息。

2 个答案:

答案 0 :(得分:4)

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

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

没有点模拟在测试中的类

当您模拟该类时,您会得到一个存根,其中包含"无所事事"与您真正的实施。 A"工作设置"看起来更像是:

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

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

但是如上所述:嘲笑你要测试的那个类没有任何意义。因为被嘲笑的对象并不知道关于"真实"执行!

答案 1 :(得分:0)

操纵环境,以便"做某事()"抛出你想要的例外。因为我们不知道"做什么()"真的不能说更多。