如何测试以下代码?
class1 {
public InjectedClass injectedClass;
method1(){
returnValue = injectedClass.someMethod;
//another logic
}
method2(){
resultValue = method1();
}
}
我的应用程序是用 Java 开发的。我使用 JUnit 和 Mockito。
为了测试 method1()
,我可以为 InjectedClass
创建一个模拟,并为 someMethod()
创建一个模拟逻辑。
但如何正确测试一种方法呢?我需要为 method1()
创建模拟吗?
更新: 让我来演示一下真实的例子。
public class Application {
@Inject
DAOFacade facade;
//method1
public ReturnDTO getDTO(LiveServiceRequestParam requestParam) throws AffiliateIdentityException {
ReturnDTO returnDTO = new ReturnDTO();
CoreProductRepository repo = recognizeProduct(ProdCodeTypeEnum.MPN, null, vendorBound);
if(repo!=null){
//logic to fill some fileds in returnDTO
}
return returnDTO ;
}
//метод2
CoreProductRepository recognizeProduct(ProdCodeTypeEnum paramType, String prodCode, List<Integer> vendors) {
CoreProductRepository coreProductRepository = null;
switch (paramType) {
case MPN:
coreProductRepository = facade.findByAlternativeMPN(prodCode, vendors);
break;
case EAN:
coreProductRepository = facade.findByEan(prodCode, vendors);
break;
case DESCRIPTION:
coreProductRepository = facade.findByName(prodCode, vendors);
break;
}
return coreProductRepository;
}
}
因此,为了测试 recognizeProduct,我模拟了 DAOfacade。但我也想测试使用 recognizeProduct 方法的 getDTO 方法。
最佳答案
您不需要模拟您的 recognizeProduct
方法。只要模拟了 DAOfacade
,其行为就是已知且确定的,因此 getDTO
和 recognizeProduct
的结果都可以得到验证。
也可以说,您甚至不需要专门测试 recognizeProduct
,因为它不是公开的,因此没有要执行的契约(Contract)。只要 getDTO
的行为经过测试和验证,就用户而言,您的 API 就可以正常工作。实现细节并不重要。
在某种程度上,专门测试 recognizeProduct
会适得其反,它会损害代码的可维护性和可靠性,而不是帮助它,因为它会使任何重构或重组更难实现,即使它确实如此不以任何方式影响外部可见的行为。
关于java - 如何正确测试java中类的内部方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27942737/