如何在使用了 Spring Boot 和 MyBatis 的应用中使用 Mockito 测试 DAO 层
在一个web
项目的开发中,对于controller
和service
的测试,可以利用mockito
框架来进行快速的单元测试。每个测试用例都只测试被测方法的功能,而不关系其调用的其他方法的功能是否正确。
@RunWith(MockitoJUnitRunner.class)
public class ActivityControllerTest {
@Mock
private ActivityService activitySearcher;
private ActivityController controller;
@Before
public void setUp() throws Exception {
controller = new ActivityController(activitySearcher);
}
@Test
public void should_return_activity_list() throws Exception {
List<Activity> activities = new ArrayList<Activity>(3);
for (int i = 1; i < 4; i++) {
Activity activity = new Activity();
activity.setId(i);
activity.setTitle("activity" + i);
activity.setCreateTime(1L);
activity.setEndTime(2L);
activity.setImg("/img/" + i + ".jpg");
activities.add(activity);
}
int page = 1;
when(activitySearcher.getList(page)).thenReturn(activities);
List<Activity> result = controller.getList(page);
assertThat(result, is(activities));
}
}
但是对于dao
层,因为使用spring
和mybatis
整合,所以我只需要写接口就可以完成工作:
@Repository
@Mapper
public interface ActivityDao {
@Select("select id, title, content, create_time, end_time, img " +
"from activity limit #{start}, #{offset}")
List<Activity> list(@Param("start") int start,
@Param("offset") int offset);
@Insert("insert into activity(title, content, create_time, end_time, img)" +
"value (#{title}, #{content}, #{createTime}, #{endTime}, #{img})")
int addActivity(Activity activity);
}
但是这样,具体的实现就交给了框架完成了。
这时,我仍旧希望能够通过mockito
框架来进行测试,模拟出数据库连接和sql
执行的结果,我应该用mock
创建什么对象呢?
是不是需要找到创建数据库连接和执行sql
的类,然后mock
出来?
但是我应该怎么去找到这些需要mock
的类呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
数据库测试没必要使用
mock
使用spring-test
直接连接数据库测试,在单元测试环境中事务会自动回滚,清理测试数据。这样准确性高也简单容易。其实连接真实的数据库我一直都认为不是单元测试的行为,而是集成测试,建议可以使用内存数据库H2或是SQLite代替MySQL来完成,内存数据库无需要真实数据库的环境,特别是在持续集成环境,我想在构建前运行单元测试,这种环境如果也需要连接真实的数据库,想想持续集成工程师得有多无助
题主知道怎么用junit测这个dao层吗?