我有一个辅助类,其中包含公共静态方法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() {
//...
}
});
}
}
我想在handleProduct()
课程中对单元测试CustomerService
方法进行单元测试。我尝试使用mockito来模拟测试中的ProductManager.getProductHandler("apple")
部分,但是,mockito不支持静态方法模拟。我如何使用Mockito进行单元测试handleProduct()
功能呢?
请不要建议我使用Powermock,因为我读了一些文章说如果我需要模拟静态方法,它表示一个糟糕的设计。但我可以接受有关代码重构的建议,以使其可测试。
答案 0 :(得分:0)
您可以自己重构并指定处理程序。如果您将测试放在与测试类相同的包中,即使它们位于不同的源文件夹(例如src vs testsrc),这些通常也可以是包私有的。 Guava (Google Commons)也有一个方便@VisibleForTesting documentation annotation,但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"产品处理程序正确交互。