Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在单元测试中模拟Appender需要创建一个实例吗?_Java_Unit Testing_Mockito - Fatal编程技术网

Java 在单元测试中模拟Appender需要创建一个实例吗?

Java 在单元测试中模拟Appender需要创建一个实例吗?,java,unit-testing,mockito,Java,Unit Testing,Mockito,我使用mockito和junit进行了一些工作单元测试,以检查是否生成了预期的日志条目 沿着这些路线 @Mock private final ListAppender<ILoggingEvent> listAppender = new ListAppender<>(); @Before public void setup() { Logger logger = (Logger) LoggerFactory.getLogger( MyClass.class );

我使用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;
    } ) );
}
@Mock
私有最终ListAppender ListAppender=新ListAppender();
@以前
公共作废设置(){
Logger Logger=(Logger)LoggerFactory.getLogger(MyClass.class);
logger.addAppender(listpappender);
}
@试验
公共void test1(){
...
//然后
验证零交互(mockAppender);
}
@试验
公共无效测试2(){
...
//然后
验证(listAppender).doAppend(ArgumentMatchers.argThis)(参数->{
断言(argument.getMessage(),包含字符串(“预期消息”);
断言(argument.getLevel(),是(Level.ERROR));
返回true;
} ) );
}
这一切都很好,效果很好

它暴露了我在理解Mocking框架时的一个弱点,尽管我不理解Appender声明

@Mock
private final ListAppender<ILoggingEvent> listAppender = new ListAppender<>(); 
@Mock
私有最终ListAppender ListAppender=新ListAppender();
如果我删除@Mock注释,那么测试将停止工作,因为我无法验证- org.mockito.exceptions.misusing.NotAMockException:传递的参数不是模拟参数

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

如果我删除初始化

@Mock
private final ListAppender<ILoggingEvent> mockAppender;
@Mock
私有最终列表追加器模拟追加器;
我得到一个构建错误


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

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

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

@Mock
private ListAppender<ILoggingEvent> mockAppender;
@Mock
私有ListAppender模拟程序;

不应为mock分配值,因为这是由Mockito执行的。但是,Mockito没有在默认构造函数中设置值(因为它不能),所以它会在以后使用反射进行设置。因此,mockAppender不能是最终的

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

@Mock
private ListAppender<ILoggingEvent> mockAppender;
@Mock
私有ListAppender模拟程序;