Java 使用Mockito对包含静态方法调用的函数进行单元测试&;异步任务
我有一个helper类,它包含一个公共静态方法Java 使用Mockito对包含静态方法调用的函数进行单元测试&;异步任务,java,unit-testing,junit,mockito,Java,Unit Testing,Junit,Mockito,我有一个helper类,它包含一个公共静态方法getProductHandler(字符串名): CustomerService类使用上述ProductHandlerManager: public class CustomerService { ... public void handleProduct() { Handler appleHandler = ProductHandlerManager.getProductHandler("apple"); apple
getProductHandler(字符串名)
:
CustomerService
类使用上述ProductHandlerManager
:
public class CustomerService {
...
public void handleProduct() {
Handler appleHandler = ProductHandlerManager.getProductHandler("apple");
appleHandler.post(new Runnable() {
@Override
public void run() {
//...
}
});
}
}
我想在CustomerService
类中对handleProduct()
方法进行单元测试。我尝试使用模拟测试中的ProductManager.getProductHandler(“apple”)
部分,但是,mockito不支持静态方法模拟。那么我如何使用Mockito来单元测试handleProduct()
函数呢
请不要建议我使用Powermock,因为我读过一篇文章,其中说如果我需要模拟静态方法,它表明一个糟糕的设计。但我可以接受关于代码重构的建议,使其可测试。您可以自己重构并指定处理程序。如果您将测试与被测试的类放在同一个包中,即使它们位于不同的源文件夹中(例如src与testsrc),这些测试通常是包私有的。虽然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(handle)
作为单元测试进行密集测试,然后仅将handleProduct()
作为集成测试进行测试,以确保“apple”产品处理程序能够正确交互。您的原始问题已经回答了这个问题。让它成为一个实例(非静态)方法。我想看看是否有其他解决方案(保持该方法静态)。例如,通过代码重构不,没有。您可以将该方法更改为非静态,使用PowerMock(不推荐),或者您可以创建一个委托非实例方法并对其进行模拟(通常在使用遗留代码时解决)。非实例方法?这是什么意思<代码>非实例
==静态
?打字,一种意味着实例
方法,即非静态
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() {
//...
}
});
}
}