Spring Boot @Autowired by generic не работает для @InjectMocks - PullRequest
0 голосов
/ 13 октября 2018

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

1 Ответ

0 голосов
/ 13 октября 2018

Поскольку вы должны протестировать BarService, вы можете сделать это, указав класс реализации, как показано ниже.

@InjectMocks private GeneralService<Bar> barService = new BarService(barDao);
...