单元测试中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;
我使用 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;