当前位置: 首页 > 知识库问答 >
问题:

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

郎慎之
2023-03-14

我试图弄清楚如何测试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);
    }
}

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

共有1个答案

姚洲
2023-03-14

让我检查一下我是否明白了您的意思:您想验证您的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);
}

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

 类似资料:
  • 我在应用程序中使用Log4JV2.0Beta3进行日志记录,并且在运行单元测试时生成日志消息。我检查了API以确定将日志级别设置为关键级别的方法,但我找不到任何方法来更改日志程序配置。 事实上,我是在log4j2网站上读到的:

  • 一般来说,你应该在运行时增加调试选项来调试问题;也可以把调试选项添加到 Ceph 配置文件里来调试启动问题,然后查看 /var/log/ceph (默认位置)下的日志文件。 Tip 调试输出会拖慢系统,这种延时有可能掩盖竞争条件。 日志记录是资源密集任务。如果你碰到的问题在集群的某个特定区域,只启用那个区域对应的日志功能即可。例如,你的 OSD 运行良好、元数据服务器却不行,这时应该先打开那个可疑

  • 问题内容: 我正在使用一个简单的基于单元测试的测试运行程序来测试我的Django应用程序。 我的应用程序本身配置为在settings.py中使用基本记录器,方法是: 在我的应用程序代码中使用: 但是,在运行单元测试时,我想禁用日志记录,以免混乱我的测试结果输出。有没有一种简单的方法可以以全局方式关闭日志记录,以便在运行测试时,特定于应用程序的记录器不会将内容写到控制台上? 问题答案: 将禁用所有级

  • 这个问题告诉我如何从RSpec模型和控制器规范测试记录器语句。不幸的是,它似乎不适用于功能规范。使用以下代码: 我得到一个错误: 文件不包含,因此在控制器操作有机会完成之前,测试似乎立即失败。 有没有办法在功能规范中使用这种语法?

  • 除了统一的HTML或XML报告之外,我如何获得Spock测试执行控制台输出或类似于我的应用程序日志? 使用Gradle2.11和Log4j支持的Slf4j。

  • 在新版本(1.1)中,我想用新列升级数据库。 在我的应用程序中,数据库升级是一个常见的崩溃,因为以前版本(1.0)中的用户没有数据库中的新列。 我尝试过使用Google Play Store的beta测试功能,但问题是没有一个有效的方法(或者至少我还没有找到一个)来做到以下几点: 唯一的方法(就我所关心的)是从测试列表中删除测试器(在Google Play systems中刷新可能需要几个小时),