我正在使用Mockit。我遇到一种情况,其中方法抛出异常,捕获异常并记录异常(并且不重新抛出)。
Class Test {
public void abc() {
try {
xyz();
} catch (Exception e) {
LOGGER.error("Exception thrown {} ", e);
}
}
private void xyz() {
// Can throw exception
// which goes to the
// callee
}
}
现在,在某些情况下,xyz()可能引发异常,并且被abc()捕获。我要测试的就是这种情况。我无法使用@Test(Expected=SomeException.class)
,因为已捕获并记录了异常。但是,我的测试用例应该查看是否抛出此异常。
我确实在网上搜索,但是没有找到任何相关内容。
任何有关方法的指针都将有所帮助。
我指的是this SO question,它看起来很相似,但不是我想要的。
IMO,基本上,您有两个选择:
模拟记录器(执行此操作所需的任何操作-重构,powermock等),这已在注释中描述。除了声明(基于我的个人经验)不鼓励通常不使用PowerMock之外,我不能对其添加太多内容。
使用“创意”解决方法:在测试中,将人工附加器添加到与类以编程方式关联的记录器中。追加程序是一种“特殊”程序,它将存储日志记录事件并提供对其的访问以进行验证:
// pseudo code that might vary depending on the actual logging framework of your choice
class MyTestAppender extends Appender {
private LoggingEvent evt = null;
public void doAppend(LoggingEvent evt) {
this.evt = evt;
}
public LoggingEvent getEvent() {
return this.evt;
}
}
// in test:
@Test
void test() {
Logger logger = LoggerFactory.getLogger(ClassUnderTest.class);
MyTestAppender myTestAppender = new MyTestAppender();
logger.addAppender(myTestAppender);
classUnderTest.doStuff();
// now you can verify whether the event has been logged (and stored by the appender):
LoggingEvent evt = myTestAppender.getEvent();
assertNotNull(evt); // cool, something was really logged, lets see what:
assertThat( // verify message, cause exception, whatever you want here
}