2017-06-20 32 views
1

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

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

为什么在测试时记录一个问题? – alfasin

+1

为什么你想嘲笑一个街区。你只能模拟对象而不是块或循环。 –

+3

为什么不只是模拟记录器? –

回答

2

您写的类将调用logger.info(obj.webService()),因此您的测试应该执行此操作。

根据测试类是否在测试中运行,让测试类执行不同的测试并不是一个好主意。所有你可以改变的是它的协作者,通常用模拟替换它们。

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

+0

我在做一个假设,但是假设NPE是记录器iteslf为空。恰当地嘲笑主要合作者foo非常棒,但没有解决第二个合作者,记录者的问题。 –

0

在评论中你声明你想避免在测试期间调用你的web服务。

我不想从我的web服务中返回任何值。

我认为你,如果你的应用程序的日志级别设置为警告或更高也不想这样。 (我在这里假设Java默认日志)

然后将溶液简单:用日志的形式,这需要SupplierLogger.info(Supplier<String> msgSupplier)

所以,你的finally块会变成:

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

然后,对于您的测试或针对此问题的生产而言,只是将您的日志记录设置为Level.NONE,并且供应商永远不会执行。