Java Mockito mock对象有多个相同类型的属性
业务类
public class TestServiceImpl {
@Autowired
@Qualifier("restTemplateA")
private RestTemplate restTemplateA;
@Autowired
@Qualifier("restTemplateB")
private RestTemplate restTemplateB;
@Override
public void test() {
restTemplateA.delete("uri");
restTemplateB.delete("uri");
}
}
尝试编写测试类
我们假设对于有相同属性的类来说,Mockito会先根据类型匹配,然后根据属性名称匹配,也就是说,我们在mock的时候声明不同的属性名称即可:
@RunWith(MockitoJUnitRunner.class)
public class TestServiceTest1 {
@InjectMocks
private TestServiceImpl testService;
@Mock
private RestTemplate restTemplateA;
@Mock
private RestTemplate restTemplateB;
@Test
public void test() {
testService.test();
}
}
正常情况下是可以测试通过的,分别对两个RestTemplate Mock也不会有问题:
@RunWith(MockitoJUnitRunner.class)
public class TestServiceTest1 {
@InjectMocks
private TestServiceImpl testService;
@Mock
private RestTemplate restTemplateA;
@Mock
private RestTemplate restTemplateB;
@Test
public void test() {
Mockito.doAnswer(invocation -> {
System.out.println("a");
return null;
}).when(restTemplateA).delete(Mockito.anyString());
Mockito.doAnswer(invocation -> {
System.out.println("b");
return null;
}).when(restTemplateB).delete(Mockito.anyString());
testService.test();
}
}
但当某些特殊场景,比如父类中有相同类型的属性,或者相同类型的属性,无论如何都有一个被调用是报空指针,可以尝试如下方式:
@RunWith(MockitoJUnitRunner.class)
public class TestServiceTest1 {
@InjectMocks
private TestServiceImpl testService;
@Mock(name = "restTemplateA")
private RestTemplate restTemplateA;
@Mock(name = "restTemplateB")
private RestTemplate restTemplateB;
@Test
public void test() {
Mockito.doAnswer(invocation -> {
System.out.println("b");
return null;
}).when(restTemplateA).delete(Mockito.anyString());
Mockito.doAnswer(invocation -> {
System.out.println("a");
return null;
}).when(restTemplateB).delete(Mockito.anyString());
testService.test();
}
}
使用@Mock
注解并指定name
属性,其中name为被测对象的属性名称。