我有一个助手类,它包含公共静态方法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与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()
作为集成测试进行测试,以确保"苹果"产品处理程序正确交互。