2012-04-20 106 views
1

我正在使用jmock(也不是我的选择,没有什么我可以改变的)关于遗留代码和编写一些junit测试(我知道,错误的顺序,没关系)和我有班级做了一些精心设计的日志记录,一般来说和Strings混淆了。我们正在使用log4j进行日志记录,我想测试这些记录的消息。我想过嘲笑Logger类,但我不知道该怎么做。使用jmock嘲笑Logger.getLogger()

由于平时我们已经记录仪做过这样的:

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

没有人有任何想法如何嘲笑方法.getLogger(类)或任何其他的想法如何检查究竟已经登录了什么?

回答

3

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

+0

哈!我甚至在几个月前就这样做了,但忘记了它。这就是我要做的,谢谢 – Edheene 2012-04-20 08:01:52

3

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

话虽如此,我认为,设置测试框架,这样好听的记录,而不会影响你的测试,确保你的测试取决于记录的内容是一个更好的办法。我曾经不得不维护一些单元测试来检查记录的内容,它们是我见过的最脆弱和无用的单元测试。我一有时间就可以重写它们。

+1

+1我也不得不保留那些嘲笑记录器的测试。完全疯狂。 – artbristol 2012-04-20 07:19:40

+0

不得不承认,我的“重写”中有大约80%是按下删除按钮;-) – Jon 2012-04-20 07:43:32

+0

但是这意味着改变测试类,我不应该这样做(当然,如果我发现任何错误除外)。我对这种情况也不高兴,但我现在没有办法做到这一点,或许在将来。无论如何感谢 – Edheene 2012-04-20 08:01:08

0

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

你只需要在注释

@UsingMocksAndStubs(Log4jMocks.class) 

添加到您的测试类和测试仪类感动了所有的代码将使用一个模拟Logger对象。

this

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