单元测试中Mocking Appender需要创建实例吗?

Mocking Appender in unit testneeds to create an instance?

我使用 mockito 和 junit 进行了一些工作单元测试,以检查是否生成了预期的日志条目。

按照这些思路

@Mock
private final ListAppender<ILoggingEvent> listAppender = new ListAppender<>();

@Before
public void setup() {
    Logger logger = (Logger) LoggerFactory.getLogger( MyClass.class );
    logger.addAppender( listAppender );
}

@Test
public void test1() {
    ...

    // then
    verifyZeroInteractions( mockAppender );
}

@Test
public void test2() {
    ...

    // then
    verify( listAppender ).doAppend( ArgumentMatchers.argThat( argument -> {
        assertThat( argument.getMessage(), containsString( "Expected Message." ) );
        assertThat( argument.getLevel(), is( Level.ERROR ) );
        return true;
    } ) );
}

一切都很好,效果很好。

尽管我不理解 Appender 声明,但它暴露了我对 Mocking 框架理解的弱点

@Mock
private final ListAppender<ILoggingEvent> listAppender = new ListAppender<>(); 

如果我删除 @Mock 注释,那么测试将停止工作,因为我无法验证 - org.mockito.exceptions.misusing.NotAMockException:传递的参数不是模拟!

但如果它是模拟的,为什么我要创建一个新实例?

如果我删除初始化

@Mock
private final ListAppender<ILoggingEvent> mockAppender;

我遇到构建错误

java: 变量 mockAppender 未在默认构造函数中初始化

不应为 mock 赋值,因为这是 Mockito 要做的。但是 Mockito 没有在默认构造函数中设置值(因为它不能),所以它稍后使用反射来设置它。因此,mockAppender 不能是最终的。

因此,您应该删除赋值和最终,因此您的声明应如下所示:

@Mock
private ListAppender<ILoggingEvent> mockAppender;