我正在使用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异常。
答案 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