在进行Junit测试用例和特定方法的模拟时,如何避免调用内部方法结构的级联

时间:2019-04-05 11:30:14

标签: java unit-testing junit mockito junit4

我正在使用Junit为公共方法创建一个测试用例。根据业务逻辑,此方法在同一类中调用一个私有方法,而该私有方法最终在单独的类中调用其他方法的序列。 所有方法都返回一个 ConcurrentHashMap ,我只想对返回的值进行测试assertNotNull
如何避免方法调用的级联?

如果我要模拟流的所有方法,那么我的测试用例将变得越来越大。 我如何才能避免这些调用,而仅对我的方法执行黑盒测试,即传递参​​数预期收益

我的方法是:

public ConcurrentHashMap<String, Object> checkValidation(Validation validationData,
            ConcurrentHashMap<String, Object> srcHMData, Statement statement) {
        Column[] columnArray = validationData.getColumnArray();
        ConcurrentHashMap<String, Object> processedData = new ConcurrentHashMap<String, Object>();
        ConcurrentHashMap<String, Object> validationData = null;

        if (columnArray != null && columnArray.length > 0) {
            for (int i = 0; i < columnArray.length; i++) {
                validationData = new ConcurrentHashMap<String, Object>();
                Column colVal = columnArray[i];
                String validationName = colVal.getName();
                validationData = processValidation(validationName, srcHMData, statement);

                processedData.putAll(validationData);
            }
        }
    return processedData;

}

它从此类调用的私有方法是:

private ConcurrentHashMap<String, Object> processValidation(String validationName,
            ConcurrentHashMap<String, Object> srcHMData, Statement statement) {

        ConcurrentHashMap<String, Object> validationData = new ConcurrentHashMap<String, Object>();
        try {
            TransformationProcess transferObj = new TransformationProcess();
            validationData = transferObj.checkTransformation(srcHMData, statement);
        } catch (Exception e1) {
            e1.printStackTrace();
        }

    return validationData;

}

我尝试过的测试方法是:

TransformationProcess transMock = mock(TransformationProcess.class);
when(transMock.checkTransformationRule(Mockito.any(), eq(dummyDataMap), eq(mockStatement))).thenReturn(validationDataMap);

我想避免在私有方法的这一行中调用内部方法-

validationData = transferObj.checkTransformation(srcHMData, statement);

,并且只想从此行返回 Mock ConcurrentHashMap ,所以我可以测试assertNotNull或其他。 但是,尽管遇到这条线,但它正在调用整个业务流程,并最终导致NullPointer异常。

1 个答案:

答案 0 :(得分:0)

您不能使用Mockito模拟new的调用。您在这里有两个选择:第一个是去powermock,它可以做更多的模仿,但是仅推荐用于旧代码;第二个是重构代码,以便可以将依赖项注入到{{1} }放入您的TransformationProcess

您可以将Validator直接注入您的方法:

TransformationProcess

这种方式看起来并不优雅,因为您必须将此依赖关系传递给需要它的每个私有方法。

或者可以通过构造函数注入依赖项:

public ConcurrentHashMap<String, Object> checkValidation(Validation validationData,
            ConcurrentHashMap<String, Object> srcHMData, Statement statement, TransformationProcess transformationProcess)

现在,您不必重复创建新实例,而可以重用对象中已有的相同实例。如果每次需要一个新的Validator(TransformationProcess transformationProcess) 实例,则可以在构造函数中注入TransformationProcess的包装,该包装将随新实例一起提供:

TransformationProcess

现在您可以创建Validator(TransformationProcessProvider transformationProcessProvider) ... TransformationProcess transformationProcess = transformationProcessProvider.getTransformationProcess(); 的模型并将其传递给您的被测对象:

TransformationProcessProvider