[英]Junit testing log statements
我有一個 java 8 應用程序,帶有 class foo,如下所示:
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
方法的返回值和日志語句以確保正在記錄某些內容。 我花了幾個小時搜索 web 來弄清楚如何設置 junit 來測試日志記錄語句。 我試過這個、 這個、 這個和這個方法都無濟於事。
我不知道這是我做錯了什么還是什么。 但這是我基於上一個示例的代碼:
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.
有沒有更簡單的方法來完成我想要的? 如果這是最好的方法那么我做錯了什么?
當然!
Appender
類clear()
它@Begin
事實上,SLF4J 已經有一個你可以查看的實現。
Logback 帶有兩個合適的 appender:
您可以在測試中進行內省。
關於如何設置 JUnit 來測試日志記錄語句,我想我找到了答案。 這是代碼。
package com.example.demo;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import lombok.Getter;
import org.junit.Test;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class FooTest {
@Test
public void somethingTest() {
Appender appender = new Appender();
Logger logger = (Logger) LoggerFactory.getLogger(Foo.class);
logger.addAppender(appender);
appender.start();
(new Foo()).something();
assertEquals(1, appender.getEvents().size());
assertEquals("doing foo test", appender.getEvents().get(0).getMessage());
}
}
@Getter
class Appender extends AppenderBase<ILoggingEvent> {
private List<ILoggingEvent> events = new ArrayList<>();
@Override
protected void append(ILoggingEvent iLoggingEvent) {
events.add(iLoggingEvent);
}
}
private Logger baseLoggerMock = (Logger) LoggerFactory.getLogger(MyService.class); private ListAppender baseListAppender = new ListAppender<>(); 私有列表 logsList = baseListAppender.list;
@BeforeEach
void setUp() {
baseListAppender.start();
baseLoggerMock.addAppender(baseListAppender);
}
@Test void shouldCallLoggerAndLogMessages() {
assertEquals(
"My Message",
logsList.get(0).getFormattedMessage());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.