在Junit测试期间禁用日志记录器?

5

在测试过程中是否可以禁用日志记录器的执行?

我有这个类:

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();
    }
}

我的单元测试由于某个对象不是一个模拟对象(我正在使用Mockito和NiceMock),导致出现了NullPointerException。

如何在不移除日志记录语句且不模拟依赖项的无关部分(如something)的情况下测试此类?

编辑:在这种情况下,something是一个客户对象,在toTest()函数中未被使用,但在该类的其他部分中需要。我在日志记录语句中使用Customer类将操作与用户相关联。

编辑2:模拟日志记录器对象是否有帮助?我会认为我会再次收到NullPointerException,因为`something´对象的方法也会被执行。


你能不能把它用 try...catch (NullPointerException) 包围起来? - bluefoot
3
永远不要捕获NullPointerException异常。 - Tomasz Nurkiewicz
4个回答

3

优化后的回答: 首先将此记录器的日志级别降低到WARNERROR。然后,用isInfoEnabled()包围日志语句:

if(logger.isInfoEnabled())
    logger.info("Executing toTest. MockMe a: {}, Foo: b: {}", mockMe.toString(), something.foo().bar());

更好的选择: 使用某个对象仅用于记录日志看起来有点奇怪,因此当您测试toTest()方法时,模拟依赖仅用于记录日志。我理解这只是一个例子,但是看起来存在一些设计缺陷。为简单起见,我建议模拟SomethingElse


2

你的日志语句引入了对something进行模拟的额外要求。你必须使其返回一个非空值,或者重写你的日志语句以避免引入这些额外的东西。


1
你可以抑制日志记录器的执行。

PowerMockito的用法:

// 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());

0

你可以使用 try catch NullPointerException

如果你的测试方法想要测试 NullPointerException,最好使用 expect NullPointerException。

@expect(NullPointerException.class)
public void testMethod() {
//your test method logic
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接