是否可以在测试期间禁用记录器的执行?
我有这个班级
public class UnitTestMe {
private final MockMe mockMe;
private final SomethingElse something;
private final Logger logger = LoggerFactory.getLogger(this.getClass().getClass());
public UnitTestMe(MockMe mockMe, SomethingElse something) {
this..
}
public toTest() {
logger.info("Executing toTest. MockMe a: {}, Foo: b: {}", mockMe.toString(), something.foo().bar());
mockMe.execute();
}
}
我的单元测试因NullPointerException而失败,因为something.foo()不是模拟对象(我使用mockito和nicemock)。
如何在不删除logger语句的情况下测试此类,而不模拟something
等依赖项的不相关部分?
编辑:在这种情况下,某些客户对象在toTest()
函数中未使用,但在此类的其他部分中需要。我在logger语句中使用Customer类将操作与用户关联起来。
编辑2:模拟记录器对象会有帮助吗?我会假设我会再次获得NullPointerException
,因为'something'对象的方法也会被执行。
答案 0 :(得分:3)
答案很差:首先将此记录器的日志记录级别降低到WARN
或ERROR
。然后,使用isInfoEnabled()
的环绕声记录语句:
if(logger.isInfoEnabled())
logger.info("Executing toTest. MockMe a: {}, Foo: b: {}", mockMe.toString(), something.foo().bar());
更好的:您仅使用某个对象进行日志记录看起来有点奇怪,因此当您测试toTest()
方法时,模拟的依赖项仅用于日志记录。我知道这只是一个例子,但看起来有一些设计缺陷。为简单起见,我建议嘲笑SomethingElse
。
答案 1 :(得分:2)
您的日志记录声明引入了对something
进行模拟的其他要求。你必须让它为foo()返回一个非null值,或者重写你的日志语句以避免引入这些额外的东西。
答案 2 :(得分:1)
您可以禁止执行记录器
// this is to suppress for logger.error(Exception e)
PowerMockito.doNothing().when(logger, "error", (Exception) any(Exception.class));
// this is to suppress for logger.debug(String message)
PowerMockito.doNothing().when(logger, "debug",anyString());
答案 3 :(得分:0)
您可以使用try catch NullPointerException
。
如果你的测试方法想测试NullPointerException,我们会更好地期待NullPointerException
@expect(NullPointerException.class)
public void testMethod() {
//your test method logic
}