我有一个要测试的课程:
public class DivisionCalculator {
private final Validator validator;
private final MathProvider mathProvider;
private final ViewProvider viewProvider;
public DivisionCalculator(Validator validator, MathProvider mathProvider, ViewProvider viewProvider) {
this.validator = validator;
this.mathProvider = mathProvider;
this.viewProvider = viewProvider;
}
public String calculate(int dividend, int divisor) {
validator.validate(dividend, divisor);
List<DivisionStep> items = mathProvider.calculate(dividend, divisor);
DivisionResult result = DivisionResult.builder()
.dividend(dividend)
.divisor(divisor)
.finalResult(mathProvider.finalResult(items))
.items(items)
.build();
return viewProvider.provideView(result);
}
}
我有下一个可以正常运行的测试类,并使用Mockito.mock(dependency.class)通过测试
和@@ InjectMock注释替换我的Mockito.mock(dependency.class))public class DivisionCalculatorTest { private ViewProvider viewProvider = Mockito.mock(ViewProvider.class); private MathProvider mathProvider = Mockito.mock(MathProvider.class); private Validator validator = Mockito.mock(Validator.class); private DivisionCalculator divisionCalculator = new DivisionCalculator(validator, mathProvider, viewProvider); DivisionResult makeDivision(int dividend, int divisor) { List<DivisionStep> items = mathProvider.calculate(dividend, divisor); return DivisionResult.builder() .dividend(dividend) .divisor(divisor) .finalResult(mathProvider.finalResult(items)) .items(items) .build(); } @Test void divisionCalculatorShouldSuccessfullyCallHisComponents() { divisionCalculator.calculate(4, 2); Mockito.verify(validator).validate(Mockito.anyInt(), Mockito.anyInt()); Mockito.verify(mathProvider).calculate(Mockito.anyInt(),Mockito.anyInt()); Mockito.verify(viewProvider).provideView(refEq(makeDivision(4, 2))); } }
但是为了遵循使用模拟的最佳实践,我想用@ Mock
我不明白我在这里缺少什么。public class DivisionTest { @Mock private Validator validator = new Validator(); @Mock private ViewProvider viewProvider = new ViewProvider(); @Mock private MathProvider mathProvider = new MathProvider(); @BeforeEach void setup() { MockitoAnnotations.initMocks(this); } @InjectMocks private DivisionCalculator divisionCalculator = new DivisionCalculator(validator, mathProvider, viewProvider); DivisionResult makeDivision(int dividend, int divisor) { List<DivisionStep> items = mathProvider.calculate(dividend, divisor); return DivisionResult.builder() .dividend(dividend) .divisor(divisor) .finalResult(mathProvider.finalResult(items)) .items(items) .build(); } @Test void divisionCalculatorShouldSuccessfullyCallHisComponents() { divisionCalculator.calculate(4, 2); Mockito.verify(validator).validate(4, 2); Mockito.verify(mathProvider).calculate(4, 2); Mockito.verify(viewProvider).provideView(refEq(makeDivision(4, 2))); } }
经过以下步骤,我得到了错误:想要但未被调用:实际上,该模拟程序的交互为零。
我有一个要测试的类:public class DivisionCalculator {private final Validator Validator;私有的最终MathProvider mathProvider;私有最终ViewProvider ...
如果您具有@Mock
和@InjectMocks
之类的注释,则需要在Junit 5中运行具有特殊扩展名的Junit测试: