Spring 通过泛型启动@Autowired 不适用于@InjectMocks
Spring Boot @Autowired by generic not work for @InjectMocks
我们知道@Autowired 的主要优点是不对具体实现进行硬编码。看看我的代码:
public interface GeneralDao<T> {
T get(Long id);
}
@Component
public class BarDao implements GeneralDao<Bar> {
@Override
public Bar get(Long id) {
Bar bar = new Bar(); // hardcode
bar.setId(id);
return bar;
}
}
public interface GeneralService<T> {
T get(Long id);
}
@Service
public class BarService implements GeneralService<Bar> {
@Autowired
private GeneralDao<Bar> barDao;
@Override
public Bar get(Long id) {
return barDao.get(id);
}
}
现在我正在尝试编写测试:
@RunWith(MockitoJUnitRunner.class)
public class BarServiceTest {
@Mock
private GeneralDao<Bar> barDao;
@InjectMocks
private GeneralService<Bar> barService;
@Test
public void get() {
Bar bar = new Bar();
bar.setId(1L);
when(barDao.get(1L)).thenReturn(bar);
Bar actualBar = barService.get(1L);
assertThat(actualBar, equalTo(bar));
}
}
但是不行!
为什么我什么时候写:
@InjectMocks private GeneralService<Bar> barService;
显示异常?通过仍在工作:
@Mock private GeneralDao<Bar> barDao
我不想这样写:
@InjectMocks private BarService barService;
由于您必须测试 BarService
,您可以通过指定实施 class 来完成,如下所示。
@InjectMocks private GeneralService<Bar> barService = new BarService(barDao);
我们知道@Autowired 的主要优点是不对具体实现进行硬编码。看看我的代码:
public interface GeneralDao<T> {
T get(Long id);
}
@Component
public class BarDao implements GeneralDao<Bar> {
@Override
public Bar get(Long id) {
Bar bar = new Bar(); // hardcode
bar.setId(id);
return bar;
}
}
public interface GeneralService<T> {
T get(Long id);
}
@Service
public class BarService implements GeneralService<Bar> {
@Autowired
private GeneralDao<Bar> barDao;
@Override
public Bar get(Long id) {
return barDao.get(id);
}
}
现在我正在尝试编写测试:
@RunWith(MockitoJUnitRunner.class)
public class BarServiceTest {
@Mock
private GeneralDao<Bar> barDao;
@InjectMocks
private GeneralService<Bar> barService;
@Test
public void get() {
Bar bar = new Bar();
bar.setId(1L);
when(barDao.get(1L)).thenReturn(bar);
Bar actualBar = barService.get(1L);
assertThat(actualBar, equalTo(bar));
}
}
但是不行! 为什么我什么时候写:
@InjectMocks private GeneralService<Bar> barService;
显示异常?通过仍在工作:
@Mock private GeneralDao<Bar> barDao
我不想这样写:
@InjectMocks private BarService barService;
由于您必须测试 BarService
,您可以通过指定实施 class 来完成,如下所示。
@InjectMocks private GeneralService<Bar> barService = new BarService(barDao);