使用jmock模拟Logger.getLogger()

时间:2012-04-20 07:03:50

标签: java junit mocking log4j jmock

我正在处理遗留代码并编写一些junit测试(我知道,错误的顺序,没关系)使用jmock(也不是我的选择,我无法改变这一点)并且我有一些类可以做一些详细的日志记录一般来说,搞乱字符串。我们使用log4j进行日志记录,我想测试那些记录的消息。我想过嘲笑Logger类,但我不知道怎么做。

通常我们让Logger这样做:

private static final Logger LOG = Logger.getLogger(SomeClass.class);

有没有人知道如何模拟方法.getLogger(类)或任何其他想法如何检查究竟记录了什么?

4 个答案:

答案 0 :(得分:3)

您可以编写自己的appender并将所有输出重定向到它。

答案 1 :(得分:3)

如果你真的认为你需要这样做,那么你需要看看PowerMock。更具体地说,它是mock static methods的能力。 PowerMock与EasyMock和Mockito集成在一起,但如果你不得不坚持下去,那么一些搜索可能会导致你找到JMock集成。

话虽如此,我认为设置测试框架以便在不影响测试的情况下很好地记录,确保测试取决于记录的内容是一种更好的方法。我曾经不得不维持一些单元测试来检查记录的内容,它们是我见过的最脆弱和无用的单元测试。一旦我有空的时间,我就重写了它们。

答案 2 :(得分:0)

检查这个类似的问题: How to mock with static methods?

顺便说一句,搜索问题的现有问题比发布问题和等待答案更容易。

答案 3 :(得分:0)

我发现最简单的方法是在JMockit中使用模拟log4j对象。

您只需添加注释

即可
@UsingMocksAndStubs(Log4jMocks.class)

到您的测试类,测试器类触及的所有代码都将使用模拟Logger对象。

请参阅this

但是这不会记录消息。你可以摆脱处理静态对象的麻烦。