在我的代码中我有一个try-finally方法。我不想最后阻止我的单元测试。我可以嘲笑我的类中的整个finally块,因为在我的情况下只是记录?我正在使用PowerMockito进行单元测试。我们能不能在单元测试中最后阻止
try {
String foo = obj.myMethod();
} finally {
logger.info(obj.webService());
}
在我的代码中我有一个try-finally方法。我不想最后阻止我的单元测试。我可以嘲笑我的类中的整个finally块,因为在我的情况下只是记录?我正在使用PowerMockito进行单元测试。我们能不能在单元测试中最后阻止
try {
String foo = obj.myMethod();
} finally {
logger.info(obj.webService());
}
您写的类将调用logger.info(obj.webService())
,因此您的测试应该执行此操作。
根据测试类是否在测试中运行,让测试类执行不同的测试并不是一个好主意。所有你可以改变的是它的协作者,通常用模拟替换它们。
在这种情况下,obj
是协作者。所以注入obj
的模拟。根据测试的意图,使用默认值可能就足够了,因此记录器将记录null
,或者您可能需要指定when
以使obj.webService()
返回有效的对象,或者您甚至可能要验证它是否为调用。
我在做一个假设,但是假设NPE是记录器iteslf为空。恰当地嘲笑主要合作者foo非常棒,但没有解决第二个合作者,记录者的问题。 –
在评论中你声明你想避免在测试期间调用你的web服务。
我不想从我的web服务中返回任何值。
我认为你,如果你的应用程序的日志级别设置为警告或更高也不想这样。 (我在这里假设Java默认日志)
然后将溶液简单:用日志的形式,这需要Supplier
:Logger.info(Supplier<String> msgSupplier)
所以,你的finally块会变成:
} finally {
logger.info(() -> obj.webService());
}
然后,对于您的测试或针对此问题的生产而言,只是将您的日志记录设置为Level.NONE,并且供应商永远不会执行。
为什么在测试时记录一个问题? – alfasin
为什么你想嘲笑一个街区。你只能模拟对象而不是块或循环。 –
为什么不只是模拟记录器? –