java - 单元测试中的 Mocking Appender 需要创建实例吗?
问题描述
我有一些使用 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: Argument(s) passed is not a mock!
但如果它是一个模拟,我为什么要创建一个新实例?
如果我删除初始化
@Mock
private final ListAppender<ILoggingEvent> mockAppender;
我收到构建错误
java:变量mockAppender未在默认构造函数中初始化
解决方案
不应为模拟分配一个值,因为这是由 Mockito 执行的。但是 Mockito 没有在默认构造函数中设置值(因为它不能),所以它使用反射来设置它。因此,mockAppender 不能是最终的。
所以,你应该删除赋值和final,所以你的声明应该是这样的:
@Mock
private ListAppender<ILoggingEvent> mockAppender;
推荐阅读
- redis - 多个微服务和 Redis - 云中每个应用程序一个数据库与一个节点
- visual-studio-2010 - Microsoft Visual Studio 无法启动程序程序集 x86
- css - 使用图像内容缩放和对齐简单的网站
- google-sheets - 谷歌表格功能试图重命名工作表
- javascript - 如何将文本放在随机数之前
?
- java - spring batch using spring boot:从配置或命令行读取参数并在作业中使用它们
- node.js - 将 Firebase CLI 更新到 8.4.0 时会出现关于“不支持的引擎”的错误,说 '{"node":">=10"}'
- xamarin - Xamarin Forms:当文本和显示设置为大时,其他所有内容也是如此
- c++ - 使用 cout 语句和 connect() 会导致我的程序崩溃的原因是什么
- java - Java:如何解析文件以获取生成图的边