Java 如何在应用程序中测试日志记录?Mockito和测试寻求方向的新概念

Java 如何在应用程序中测试日志记录?Mockito和测试寻求方向的新概念,java,logging,mockito,Java,Logging,Mockito,我试图弄清楚如何测试LoggingRestService类中编写的方法。我想验证我的(外部)错误方法是否在此记录器中生成正确的日志条目 private static final Logger LOGGER = LoggerFactory.getLogger(LoggingRestService.class); @POST @Path("debug") @ApiOperation(value = "Writes js error message log. (not secured)") @Api

我试图弄清楚如何测试LoggingRestService类中编写的方法。我想验证我的(外部)错误方法是否在此记录器中生成正确的日志条目

private static final Logger LOGGER = LoggerFactory.getLogger(LoggingRestService.class);

@POST
@Path("debug")
@ApiOperation(value = "Writes js error message log. (not secured)")
@ApiResponse(code = 200, message = "Message logged")
public void getUserList(@ApiParam(value = "Js debug message.")
                                String message) {
    ConverterUtils.error(LOGGER, message, null);
}
}

以下是ConverterUtils错误方法:

public static void error(Logger logger, String mess, Exception ex) {
    Class<?> aClass = logger.getClass();
    try {
        Method method = aClass.getMethod("error", String.class, Throwable.class);
        method.invoke(logger, mess, ex);
    } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
        LOGGER.error("get logger error", e);
    }
}
公共静态无效错误(记录器、字符串混乱、异常ex){
类aClass=logger.getClass();
试一试{
Method=aClass.getMethod(“error”,String.class,Throwable.class);
调用(logger、mess、ex);
}catch(NoSuchMethodException | InvocationTargetException | IllegalAccessException e){
LOGGER.error(“获取记录器错误”,e);
}
}

我从未使用过mockito,但我对mocking类的概念有点熟悉。不过我还是有点困惑。我没有得到太多的测试指导,试图自给自足正在慢慢腐蚀我的信心。非常感谢。

让我检查一下是否明白您的意思:您想验证您的ConverterUtil类是否正在调用带有适当消息和异常的error方法

要做到这一点,您需要确保使用模拟版本的记录器调用ConverterUtils类。您可以使用mock(Logger.class)实现这一点。即使Logger是一个类而不是一个接口,这也会起作用,因为Mockito可以模拟非最终类。它实际上会为您创建一个子类

您的测试代码将如下所示:

Logger mockedLogger = mock(Logger.class);
String expectedMessage = "Whatever";
Exception expectedException = new Exception();

// Business method
ConverterUtils.error(mockedLogger, expectedMessage, expectedException);

// Asserts
verify(mockedLogger).error(expectedMessage, expectedException);
在一个侧节点上:这让我很困惑,为什么error方法没有那么简单:

public static void error(Logger logger, String mess, Exception ex) {
    logger.error(mess, ex);
}

我真的不明白为什么你需要在这里使用反射层。您确切地知道您想要什么方法,所以为什么不直接按原样调用该方法。

很高兴看到有人测试日志记录。我一直在(断断续续地)编写一个库来帮助测试日志记录,部分基于此,这是一个关于如何测试日志记录的很好的描述。也许会有帮助。(看看谷歌,有几篇关于测试日志的文章)