Мы знаем, что основным преимуществом @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;