![](/img/trans.png)
[英]how to do unit test in a method that contains a local Set<String> variable?use powerMock or Mockito
[英]Use Mockito to unit test a function which contains static method call & async task
我有一个帮助器类,其中包含一个公共静态方法getProductHandler(String name)
:
public class ProductHandlerManager {
public static Handler getProductHandler(String name) {
Handler handler = findProductHandler(name);
return handler;
}
}
CustomerService
类使用上面的ProductHandlerManager
:
public class CustomerService {
...
public void handleProduct() {
Handler appleHandler = ProductHandlerManager.getProductHandler("apple");
appleHandler.post(new Runnable() {
@Override
public void run() {
//...
}
});
}
}
我想对CustomerService
类中的handleProduct()
方法进行单元测试。 我尝试使用Mockito模拟测试中的ProductManager.getProductHandler("apple")
部分,但是,Mockito不支持静态方法模拟。 然后,如何使用Mockito对handleProduct()
函数进行单元测试?
请不要建议我使用Powermock,因为我读过一些文章说如果我需要模拟静态方法,则表明设计不好。 但是我可以接受有关代码重构以使其可测试的建议。
您可以自己重构和指定处理程序。 如果将测试与被测类放在同一包中,则这些包通常可以是包私有的,即使它们位于不同的源文件夹中(例如src vs testsrc)。 Guava(Google Commons)也有一个方便的@VisibleForTesting文档注释 ,尽管Javadoc也可以正常工作。
public class CustomerService {
public void handleProduct() {
handle(ProductHandlerManager.getProductHandler("apple"));
}
/** Visible for testing. */
void handleProduct(Handler handler) {
handler.post(new Runnable() {
@Override
public void run() {
//...
}
});
}
}
此时,您可以对handleProduct(Handler)
进行密集测试作为单元测试,然后仅对handleProduct()
进行集成测试,以确保“ apple”产品处理程序正确交互。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.