Mockito如何使用log4j2.18捕获多个logEvent对象以连续调用同一个方法

cl25kdpy  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(187)

我正在使用Mockito来验证我的日志是否发送了正确的消息。然而,测试结果是不正确的,因为日志事件是可变的,所以当我连续调用同一个方法时,它只返回最近的值,而不是两个不同的值。因此,我试图返回一个LogEvent对象,或者在捕获事件之前附加该事件。
也就是说,当我验证并附加捕获时

verify(mockAppender, times(2)).doAppend(loggingEventCaptor.capture());
List<LoggingEvent> capturedLoggingEvents = loggingEventCaptor.getAllValues();
capturedLoggingEvents.get(0).message // this is printing "Test 2" but should be "Test 1"
capturedLoggingEvents.get(1).message // this is printing "Test 2"

loggingEventCaptor.messages是相同的。“测试2”、“测试2”,但是我希望它具有“测试1”和“测试2:用于我的junit 4测试用例。
我试着创建一个间谍但是和一个当命令但是我变得无效有人能帮助吗

LoggingEvent logEvent = Mockito.spy(loggingEventCaptor.capture());
when(mockAppender.doAppend(loggingEventCaptor.capture())).thenReturn(LogEvent);
verify(mockAppender, times(2)).doAppend(loggingEventCaptor.capture());

但是我得到了错误。基本上我希望loggingEventCaptor包含一个单独的LogEvent对象,而不是1个可变的。所以我可以得到“Test1”和“Test 2”,而不是“Test 2”和“Test 2”。或者,另一种方法是在更改可变的事件时存储所有这些事件,但我不知道如何做到这一点。请有人指导一下,谢谢。我'我使用log4j 1导入,但我有一个1- 2Log 4j桥。
编辑:因此在调试器模式中,它将返回单独的对象ID LogEventAdaptor@123 LogEventAdaptor@124,但在apdator中,它具有MutableLogEvent@124 MutableLogEvent@124以及来自LogEventAdaptor@124的消息。这就是测试用例失败的原因

mkshixfv

mkshixfv1#

要实现所需的行为,可以使用Mockito提供的ArgumentCaptor类。该类允许您捕获传递给模拟方法的参数,然后验证它们的值。下面是如何在测试中使用该类的示例:

// Create an ArgumentCaptor to capture LoggingEvent objects
ArgumentCaptor<LoggingEvent> loggingEventCaptor = ArgumentCaptor.forClass(LoggingEvent.class);

// Verify that the doAppend method is called twice, and capture the LoggingEvent objects
verify(mockAppender, times(2)).doAppend(loggingEventCaptor.capture());

// Get the list of captured LoggingEvent objects
List<LoggingEvent> capturedLoggingEvents = loggingEventCaptor.getAllValues();

// Verify the values of the captured LoggingEvent objects
assertEquals("Test 1", capturedLoggingEvents.get(0).message);
assertEquals("Test 2", capturedLoggingEvents.get(1).message);

在这段代码中,loggingEventCaptor对象在调用doAppend方法时捕获传递给它的LoggingEvent对象。然后,您可以使用loggingEventCaptor对象的getAllValues方法获取所有捕获的LoggingEvent对象的列表。最后,您可以使用Assert验证捕获的对象的值。

相关问题