首页 > 解决方案 > 如何使用 mockito 模拟注入对象的属性

问题描述

我想测试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

}

这是我的课堂测试:

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));


    }

标签: javamockitotestngguice

解决方案


被测实例 (PlaylistBusinessBean) 由 DI 框架注入。然而,那个不是使用在测试中创建的 PlaylistDaoBean 的模拟。mock 只是一个局部变量,它不会在任何地方使用。

与其使用注入的 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 上下文,它在需要时将模拟注入到测试中的 bean。如何做到这一点取决于所使用的 DI。

推荐阅读