【发布时间】:2016-12-16 03:07:09
【问题描述】:
我有一个 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.
有没有更简单的方法来完成我想要的?如果这是最好的方法,那我做错了什么?
【问题讨论】:
-
提示。您的问题是代码中出现的 new 语句。您可以在这里stackoverflow.com/questions/38863913/… 了解如何摆脱对静态方法或新方法的调用。并且:要了解为什么 new 会出现问题,您可能需要观看一些视频:youtube.com/playlist?list=PLD0011D00849E1B79 ... 认真:每一分钟都值得您花时间。
-
Foo 的记录器没有编写或实现,您可以测试记录器。您只需调用 new Foo,此时 foo 有自己的记录器
标签: java unit-testing logging junit slf4j