我有一个带有类foo的java 8应用程序:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Foo {
private final Logger log = LoggerFactory.getLogger(Foo.class);
public String something() {
log.info("doing foo test");
return "test";
}
}
我正在编写一个JUnit(Junit 4.11)测试用例,如下所示:
public class FooTest {
private Foo foo;
@Before
public void setUp() throws Exception {
foo = new Foo();
}
@Test
public void testSomething() {
String result = foo.something();
assertEquals(result,"test");
}
}
我的目标是编写一个测试用例来测试something
方法的返回值 AND 日志记录语句,以确保记录某些内容。我花了好几个小时在网上搜索如何设置junit来测试日志记录语句。我已尝试this,this,this和this方法无济于事。
我不知道这是不是我做错了什么。但是这里的代码基于最后一个例子:
public class FooTest {
private Foo foo;
@Mock private Appender appender;
@Captor private ArgumentCaptor captor;
@Before
public void setUp() throws Exception {
foo = new Foo();
MockitoAnnotations.initMocks(this);
Logger.getRootLogger().addAppender(appender);
}
@After
public void tearDown() throws Exception {
Logger.getRootLogger().removeAllAppenders();
}
@Test
public void testSomething() {
String result = foo.something();
assertEquals(result,"test");
verify(appender).doAppend(((LoggingEvent) captor.capture()));
LoggingEvent loggingEvent = (LoggingEvent) captor.getValue();
assertEquals(loggingEvent.getRenderedMessage(), "doing foo test");
}
}
但是当我运行这个时,我收到以下错误:
Wanted but not invoked:
appender.doAppend(<Capturing argument>);
-> at <package>.testSomething(FooTest.java:22)
Actually, there were zero interactions with this mock.
有没有更简单的方法来实现我想要的?如果这是最好的方式,那么我做错了什么?
答案 0 :(得分:7)
当然!
Appender
类clear()
@Begin
事实上,SLF4J已经有an implementation这个你可以看一下。
答案 1 :(得分:0)
Logback 带有两个合适的 appender:
您可以在测试中进行内省。