我们可以在单元测试中模拟最终阻止

时间:2017-06-20 16:23:03

标签: java unit-testing junit powermockito

在我的代码中,我有一个try-finally方法。我不想最后阻止我的单元测试。我可以在我的类中模拟整个finally块,因为在我的情况下它只是记录吗?我是使用PowerMockito进行单元测试。

try {
    String foo = obj.myMethod();
} finally {
    logger.info(obj.webService());
}

2 个答案:

答案 0 :(得分:2)

您编写的课程将调用logger.info(obj.webService()),因此您的测试应该练习。

根据是否在测试中运行,让您的被测试课程做不同的事情并不是一个好主意。所有你可以改变的是它的协作者,通常用模拟代替它们。

在这种情况下,obj是协作者。所以注入obj的模拟。根据测试的意图,使用默认值可能就足够了,因此记录器将记录null,或者您可能需要指定when以使obj.webService()返回有效值对象,或者您甚至可能想要验证它是否已被调用。

答案 1 :(得分:0)

在评论中,您声明要避免在测试期间调用您的Web服务。

  

在我回来的时候,我不希望我的网络服务有任何价值。

如果您的应用程序的日志级别设置设置为WARNING或更高,我认为您也不想要这个。 (我在这里假设java默认日志记录)

解决方案很简单:使用记录表格,其中SupplierLogger.info(Supplier<String> msgSupplier)

所以你的终结块会变成:

} finally {
    logger.info(() -> obj.webService());
}

然后,对于您的测试或生产中的问题,只需将您的日志记录设置为Level.NONE,供应商将永远不会被执行。