在junit测试期间禁用记录器?

时间:2011-04-09 13:04:22

标签: java unit-testing logging mocking

是否可以在测试期间禁用记录器的执行?

我有这个班级

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'对象的方法也会被执行。

4 个答案:

答案 0 :(得分:3)

答案很差:首先将此记录器的日志记录级别降低到WARNERROR。然后,使用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)

您可以禁止执行记录器

PowerMonkito的用例:

// 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
}