[英]Mockito - Wanted but not invoked: Actually, there were zero interactions with this mock
[英]Mockito with @Mock and @InjectMock Wanted but not invoked: Actually, there were zero interactions with this mock
我有一個要測試的課程:
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)通過測試
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和@InjectMock注釋替換我的Mockito.mock(dependency.class)
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)));
}
}
在執行以下步驟后,我收到錯誤:需要但未調用:實際上,與此模擬的交互為零。 我不明白我在這里錯過了什么。
如果您有@Mock
和@InjectMocks
類的注釋, @InjectMocks
需要在 Junit 5 中使用特殊擴展名運行 Junit 測試:
@ExtendWith(MockitoExtension.class)
class MyTest {
@Mock
private Validator validator;
...
}
另請注意,此擴展為您創建模擬並將值注入帶注釋的數據字段。 因此,從技術上講,像您在問題中顯示的那樣創建真實對象是錯誤的:
public class DivisionTest {
@Mock
private Validator validator = new Validator(); // this is wrong, don't use "new"
@Mock
private ViewProvider viewProvider = new ViewProvider(); // this is wrong, don't use "new"
@Mock
private MathProvider mathProvider = new MathProvider(); // this is wrong, don't use "new"
您可以按照本教程獲取更深入的示例和解釋。
為了完整起見,如果您使用的是 Junit 4,您可以使用:
@RunWith(MockitoJUnitRunner.class)
public class DivisionTest {...}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.