c class FruitServiceTest {
/**
* import.sql中导入的记录数量,这些是应用启动是导入的
*/
private static final int EXIST_RECORDS_SIZE = 3;
/**
* import.sql中,第一条记录的id
*/
private static final int EXIST_FIRST_ID = 1;
/**
* 在Fruit.java中,id字段的SequenceGenerator指定了initialValue等于10,
* 表示自增ID从10开始
*/
private static final int ID_SEQUENCE_INIT_VALUE = 10;
@Inject
FruitService fruitService;
@Test
@DisplayName("list")
@Order(1)
public void testGet() {
List<Fruit> list = fruitService.get();
// 判定非空
Assertions.assertNotNull(list);
// import.sql中新增3条记录
Assertions.assertEquals(EXIST_RECORDS_SIZE, list.size());
}
@Test
@DisplayName("getSingle")
@Order(2)
public void testGetSingle() {
Fruit fruit = fruitService.getSingle(EXIST_FIRST_ID);
// 判定非空
Assertions.assertNotNull(fruit);
// import.sql中的第一条记录
Assertions.assertEquals("Cherry", fruit.getName());
}
@Test
@DisplayName("update")
@Order(3)
public void testUpdate() {
String newName = "ShanDongBigCherry";
fruitService.update(EXIST_FIRST_ID, new Fruit(newName));
Fruit fruit = fruitService.getSingle(EXIST_FIRST_ID);
// 从数据库取出的对象,其名称应该等于修改的名称
Assertions.assertEquals(newName, fruit.getName());
}
@Test
@DisplayName("create")
@Order(4)
public void testCreate() {
Fruit fruit = new Fruit("Orange");
fruitService.create(fruit);
// 由于是第一次新增,所以ID应该等于自增ID的起始值
Assertions.assertEquals(ID_SEQUENCE_INIT_VALUE, fruit.getId());
// 记录总数应该等于已有记录数+1
Assertions.assertEquals(EXIST_RECORDS_SIZE+1, fruitService.get().size());
}
@Test
@DisplayName("delete")
@Order(5)
public void testDelete() {
// 先记删除前的总数
int numBeforeDelete = fruitService.get().size();
// 删除第一条记录
fruitService.delete(EXIST_FIRST_ID);
// 记录数应该应该等于删除前的数量减一
Assertions.assertEquals(numBeforeDelete-1, fruitService.get().size());
}
}
- 一共五个测试方法,为了给它们排序,要用注解TestMethodOrder修饰类,并制定value为MethodOrderer.OrderAnnotation.class
- 再在每个方法上用Order注解修饰,就可以用value执行测试顺序了
- 测试方法有点多,为了便于观察,用注解DisplayName为每个测试方法起了个名字,有了名字,IDEA上的测试结果效果如下
- 单元测试代码写完了,是不是可以立即开始测试了?别急,还有个小坑,有一定几率遇到,别看坑小,要是掉进去还有点麻烦...
IDEA的小坑
- 回顾之前的配置,数据库信息都放在application-test.properties文件中,因此只有profile等于test时,才有数据库配置信息,其他profile都没有对应的配置文件
- 一般情况下,如何执行单元测试呢?欣宸的习惯是直接点击下图红框中的按钮,在弹出的菜单上选择第一项Run ‘FruitServiceTest’,这样操作简单,又能通过IDEA界面观察测试结果
- 在弹出的配置窗口中,新增下图红框中的内容,这就指定了profile等于test
- 运行的时候,选择上图配置的名字FruitServiceTest(test-profile),就能确保profile是test了
运行单元测试
- 运行单元测试,结果如下图,不但测试全部通过,输出的日志内容也非常丰富,解读他们,是温习前面知识点的最佳手段
- 还有一处要注意的,就是上图显示getSingle方法耗时仅6ms,例外,getSingle执行的时候也没有SQL日志输出,这是因为getSingleb并没有真正的查询数据库,而是使用了前面list的缓存结果,验证是否使用了缓存很简单,将testGet和testGetSingle两个方法的执行顺序调换一下,再执行,就发现testGetSingle执行耗时也变长了,而且SQL日志也出现了
- 上述这种不查数据库而走本地缓存的操作,虽然看似提升了性能,然而风险也不小,getSingle得到的结果并非数据库中最新的,关闭缓存的方法如下图,修改Fruit.java的配置,如下图
- 至此,相比官方demo更加精简的quarkus数据库操作入门已完成,希望本篇能让咱们对quarkus的数据库操作能力和流程有基本的认识,为接下来的逐渐深入打好基础
欢迎关注博客园:程序员欣宸
学习路上,你不孤单,欣宸原创一路相伴...
|