java - 如何正确测试java中类的内部方法

标签 java unit-testing testing junit mockito

如何测试以下代码?

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,其行为就是已知且确定的,因此 getDTOrecognizeProduct 的结果都可以得到验证。

也可以说,您甚至不需要专门测试 recognizeProduct,因为它不是公开的,因此没有要执行的契约(Contract)。只要 getDTO 的行为经过测试和验证,就用户而言,您的 API 就可以正常工作。实现细节并不重要。

在某种程度上,专门测试 recognizeProduct 会适得其反,它会损害代码的可维护性和可靠性,而不是帮助它,因为它会使任何重构或重组更难实现,即使它确实如此不以任何方式影响外部可见的行为。

关于java - 如何正确测试java中类的内部方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27942737/

相关文章:

testing - 如何 `go test` 我项目中的所有测试?

node.js - 如何构建等待进程首先完成的 Mocha 测试?

java - 动态更改日志记录级别

c# - Autofac RegisterGeneric 适用于单元测试但不适用于应用程序

java - 当我将 Realm 查询与 RxJava 一起使用时,关闭 Realm 实例

c# - Rhino 模拟 - AssertWasCalled : How to improve unclear diagnostic message when incorrect arguments

angular - Electron Angular : Running Karma errors because of undefined ipcRenderer inside angular component

REST API 设计指南合规性测试

java - 如何添加二叉树的特定部分但保持树完好无损(Java)?

java - 在 Java 中更改变量值的最传统方法是什么?