我正在使用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);并且只想从此行返回一个模拟的ConcurrentHashMap,以便我可以测试assertNotNull或其他。但是,尽管遇到这条线,但它正在调用整个业务流程,并最终导致NullPointer异常。 最佳答案 您不能使用Mockito模拟new的调用。您在这里有两个选择:第一个是使用powermock,它可以做更多的模仿,但仅建议用于旧版代码;第二个是重构代码,以便可以将对TransformationProcess的依赖项注入到。您可以将Validator直接注入到您的方法中: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();现在您可以创建TransformationProcess的模拟并将其传递给您的测试对象:TransformationProcessProvider providerMock = mock(TransformationProcessProvider.class);TransformationProcess transMock = mock(TransformationProcess.class);when(providerMock.getTransformationProcess()).thenReturn(transMock);when(transMock.checkTransformationRule(Mockito.any(), eq(dummyDataMap), eq(mockStatement))).thenReturn(validationDataMap);Validator validatorUnderTest = new Validator(providerMock);
09-10 23:12