是的,您阅读正确:用Java模拟记录器“。当您第一次看到此消息时,这听起来可能很奇怪,但是在某些特殊情况下,对应用程序的某些部分进行单元测试的唯一方法是通过检查是否记录了某些特定消息。
例如,假设您的应用程序需要对某些其他WebService进行异步调用。 然后,您将具有用于进行该调用的单独线程。 对于主线程,对服务的调用是否成功无关紧要,因为它不会等待响应(否则它将是同步的,对吗?)。 假设您的应用程序的这一部分将仅调用该服务,然后,仅记录该调用是否成功(不用说,在这种情况下,您需要一个监视工具来了解何时情况不会发生) 生产良好)。
现在,您必须创建一个JUnit测试用例来涵盖这些场景。 如果您使用Google搜寻,将会发现一些使用动力模拟为此,但请想象您已经在使用莫基托并且由于某种原因,您想使用莫基托只要。
在这篇文章中,我假设您已经熟悉莫基托,因此我将重点放在“模拟记录器”部分。您可以找到很多莫基托如果您想学习互联网上的教程。
好的。 实现此目的的一种方法是模拟追加者你的记录仪对象和用途莫基托的ArgumentCaptor捕获测试用例中的所有日志事件:
@Mock
private Appender mockedAppender;
@Captor
private ArgumentCaptor<LoggingEvent> loggingEventCaptor;
然后,您必须确保追加者添加到根目录记录仪在执行测试之前:
@Before
public void setup() {
Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
root.addAppender(mockedAppender);
root.setLevel(Level.INFO);
}
之后,您就可以调用测试的类并对记录的消息进行断言了:
@Test
public void testSuccessCall() throws Exception {
// mock all required response objects in here
[...]
// this is the call to the service being tested
myService.execute(createRequestForSuccessResponse());
// check how many times the ArgumentCaptor was called
verify(mockAppender, times(1)).doAppend(loggingEventCaptor.capture());
// get the reference to the LoggingEvent you want to inspect
LoggingEvent loggingEvent = loggingEventCaptor.getAllValues().get(0);
// check the logged message
assertEquals("Webservice was successfully called", loggingEvent.getMessage());
// check the log level
assertEquals(Level.INFO, loggingEvent.getLevel());
}
我希望当您面对这种特殊情况时,这最终可能会有所帮助! ;-)
from: https://dev.to//claudiohigashi/mocking-logger-in-java-with-mockito-51k8