单元测试异常捕获时写入的日志消息

时间:2014-06-28 21:51:57

标签: java unit-testing exception-handling mocking mockito

以下是我正在使用的代码。在此测试中,我想验证在捕获异常时是否正在调用log方法。

public class SuperClass(){
   public void log()
   {
      do some logging;
   }
}

public class ClassUnderTest extends SuperClass(){

    public String methodbeingtested(Object param)
    {
      try
         {
             String a = SomeObject.
                              methodthatthrowsexception(param);//static method, throws JAXB/NPE
         }
      catch(Exception exp)
         {
             log("log msg",exp);//inherited method
         }
    }
}


public class ClassUnderTestTest {

    @Test
    public testmethodbeingtested(){
       ClassUnderTest cut = new ClassUnderTest()
       ClassUnderTest cutspy = Mockito.spy(cut);

       cutspy.methodbeingtested(param);

       Mockito.verify(cutspy).log("log msg", new Exception()); // exp is needed to here.  
    }
}

看了几个样本后,上面是我能得到的最接近的样本。此测试用例强制执行异常。但它无法验证日志方法调用,因为Mockito.verify需要捕获的确切异常(exp),测试用例无权访问。

有没有其他方法可以测试这种情况?

2 个答案:

答案 0 :(得分:1)

您应该模拟日志框架,将其注入类中,然后验证是否调用了日志方法,而不是监视ClassUnderTest。 ID'还模拟了SomeObject类并让它抛出异常。

顺便说一句,您应该真正评估是否需要验证日志语句。也许您有充分的理由这样做,但通常情况下,不需要断言/验证到这个程度,只会使您的测试变得脆弱。

答案 1 :(得分:1)

Mockito的verify方法可以与参数匹配器一起使用。如果你想验证log被调用,而任何Exception作为第二个参数,你可以写

verify(cutspy).log(eq("log msg"), any(Exception.class));

我假设您拥有verifyeqany的正确静态导入。

另外,此测试不需要PowerMock。您的第PowerMock.expectLastCall().once();行既冗余又令人困惑,应该与@PrepareForTest注释一起删除。