Как смоделировать атрибут внедренного объекта с помощью mockito - PullRequest
0 голосов
/ 14 декабря 2018

Я хотел бы проверить метод deleteTracks и для этого мне нужно смоделировать плейлист, который я получаю после вызова playlistDaoBean.getPlaylistByUUID(uuid)

public class PlaylistBusines {

private PlaylistDao playlistDao;

@Inject
public PlaylistBusinessBean(PlaylistDaoBean playlistDaoBean){
    this.playlistDaoBean = playlistDaoBean;
}

List<PlayListTrack> deleteTracks(String uuid, List<Integer> indexes) throws PlaylistException {


    PlayList playList = playlistDaoBean.getPlaylistByUUID(uuid);
    // TODO

}

Thisмой классовый тест:

public class PlaylistBusinessTest {

    @Inject
    PlaylistBusinessBean playlistBusinessBean;


     @Test
    public void testRemoveTracks() throws Exception {

    PlayList playList = new PlayList();
    playList.setId(222)
    playList.setName("fake name");


    PlaylistDaoBean playlistDaoBeanMock = mock(PlaylistDaoBean.class);
    when(playlistDaoBeanMock.getPlaylistByUUID(uuid)).thenReturn(playList);


    playlistBusinessBean.removeTracks(uuid, Arrays.asList(2, 3));


    }

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Тестируемый экземпляр (PlaylistBusinessBean) внедряется структурой DI.Этот, однако, не использует макет PlaylistDaoBean, созданный в тесте.Макет - это просто локальная переменная, и он нигде не используется.

Вместо использования внедренного экземпляра PlaylistBusinessBean создайте его программно и передайте макет PlaylistDaoBean:

public class PlaylistBusinessTest {

     @Test
    public void testRemoveTracks() throws Exception {

    PlayList playList = new PlayList();
    playList.setId(222)
    playList.setName("fake name");


    PlaylistDaoBean playlistDaoBeanMock = mock(PlaylistDaoBean.class);
    when(playlistDaoBeanMock.getPlaylistByUUID(uuid)).thenReturn(playList);

    PlaylistBusinessBean playlistBusinessBean = new PlaylistBusinessBean(playlistDaoBeanMock);

    playlistBusinessBean.removeTracks(uuid, Arrays.asList(2, 3));


    }

Общие примечания:

  • Этомодульное тестирование, поэтому я всегда рекомендовал бы тестировать код изолированно, независимо от DI и любого внедренного кода.
  • Однако, если это действительно необходимо, обычно также возможен специфичный для теста контекст DI, который создает инъекционные макетык тестируемым бобам, где это необходимо.Как это сделать, зависит от используемого DI.
0 голосов
/ 14 декабря 2018

Причина, по которой это не работает, заключается в том, что вы не предоставили макет в качестве аргумента PlaylistBusines.

Было бы целесообразно указать ошибку, но по макету вы определяете поведениеникогда не используется в тестируемом классе.

...