我有Class A和ClassB。B是在Class A中自动接线的。现在我想使用Mockito测试流程。
问题是,当我尝试使用@InjectMock
在测试用例中模拟类A和类B时,它去了类A,但没有调用类B。
我不想模拟在A类中自动装配的B类,它应该从A类调用B类并获取用户详细信息数据。
@Component
public class A {
@Autowired
private B b;
public Users getUsers() {
Long id = 10;
b.getUserDetails(id);
// some Logic
}
}
@Component
public class B {
public UserDetails getUserDetails(Long id) {
// some logic to get users details ..
}
}
@RunWith(MockitoJUnitRunner.class)
public class TestA {
@InjectMocks
private A a;
@InjectMocks
private B b;
@Test
public void testA() {
Users actual = a.getUsers();
assertEquals(actual, expected());
assertNotNull(actual);
}
private Users expected() {
return new Users(); // expected users object
}
}
答案 0 :(得分:2)
答案 1 :(得分:0)
您应该将B上方的 @InjectMocks 注释更改为 @Spy ,并且还应将A上方的 @Spy 添加。因为您想使用 B.class 和 A.class 的实际方法。为什么需要使用 @Spy ?
如果您对所有方法都使用 @Mock ,默认情况下,mock返回null,空集合或适当的原始/原始包装值(例如0,false,null等)>
如果您使用 @Spy ,则将调用实际方法(除非已存入方法)。
因此,您在 TestA.class 中创建的内容应类似于:
@Spy @InjectMocks私人A a;
@间谍私人B b;