以下是我正在使用的代码。在此测试中,我想验证在捕获异常时是否正在调用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),测试用例无权访问。
有没有其他方法可以测试这种情况?
答案 0 :(得分:1)
您应该模拟日志框架,将其注入类中,然后验证是否调用了日志方法,而不是监视ClassUnderTest。 ID'还模拟了SomeObject类并让它抛出异常。
顺便说一句,您应该真正评估是否需要验证日志语句。也许您有充分的理由这样做,但通常情况下,不需要断言/验证到这个程度,只会使您的测试变得脆弱。
答案 1 :(得分:1)
Mockito的verify
方法可以与参数匹配器一起使用。如果你想验证log
被调用,而任何Exception
作为第二个参数,你可以写
verify(cutspy).log(eq("log msg"), any(Exception.class));
我假设您拥有verify
,eq
和any
的正确静态导入。
另外,此测试不需要PowerMock。您的第PowerMock.expectLastCall().once();
行既冗余又令人困惑,应该与@PrepareForTest
注释一起删除。