Jmockit模拟@Qualifier和@Resource注入对象
开发的代码中有时会使用@Qualifier配合着@Autowired一起使用, 或者是使用@Resource来注入对象, 当Jmockit中使用@Injectable来修饰被测试代码依赖的类时, 会出现如下报错信息:
java.lang.IllegalStateException: Missing @Injectable for field "xxx.xxx.xxx.xxxxx.service.OrderService orderService" in UserServiceImpl
业务代码:
/**
* OrderService有两个实现类,分别为:OrderServiceImpl和NewOrderServiceImpl
*/
@Resource(name = "newOrderServiceImpl")
private OrderService orderService;
@Override
public void useOrderService() {
String orderId = orderService.getOrderId();
System.out.println(orderId);
}
OrderServiceImpl
@Service
public class OrderServiceImpl implements OrderService {
@Override
public String getOrderId() {
return "orderServiceId";
}
}
NewOrderServiceImpl
@Service
public class NewOrderServiceImpl implements OrderService {
@Override
public String getOrderId() {
return "newOrderId";
}
}
解决上述报错的测试案例:
/**
* OrderService变量名newOrderServiceImpl要跟@Resource(name = "newOrderServiceImpl")中保持一致
*/
@Injectable
private OrderService newOrderServiceImpl;
@Tested
private UserServiceImpl userServiceImpl;
@Test
public void testUserOrderService() {
userServiceImpl.useOrderService();
}
业务代码2:
/**
* 注入时使用了@Qualifier
*/
@Autowired
@Qualifier("newOrderServiceImpl")
private OrderService orderService;
@Override
public void useOrderService() {
String orderId = orderService.getOrderId();
System.out.println(orderId);
}
解决方案与上述测试案例相同, 保持测试案例中的变量名与@Qualifier(“newOrderServiceImpl”)中的值一致