java - 如何使用 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));
}
解决方案
被测实例 (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。
推荐阅读
- git - 学习使用 Git。本地仓库/项目文件目录
- java - 即使活动更改或应用程序关闭,使用共享首选项存储数据并显示它
- sqlite - SQLite中多个表的数据库查询
- javascript - 24 小时内通过正态分布分配负载,高峰在中午?
- c - 在 C 中的循环内的 sleep 函数存在问题
- sql - 同一张表之间的2种不同类型的关系
- android - 如何从 Android Manifest 元标记中引用我的 colors.xml 文件?
- wordpress - 上传适合区域的大型背景图片的推荐尺寸是多少?
- c# - 我们如何在逻辑应用程序中转义 json 数据?
- linux - 如何在shell中使用正则表达式来匹配文件名?