🍃前言
今天我们来对前面所开发的数据库操作的功能进行测试一下
🌳准备工作
由于我们接下来要写很多测试用例
并且我们希望每个方法都是一个/一组单元测试用例,互不干扰
所以我们还做一些准备工作,需要写两个方法, 分别用于进行 “准备工作” 和 “收尾工作”
这里我们使用注解的方式进行实现
添加@BeforeEach
,表示每个测试单元开始前都要执行该方法
在这个方法里我们需要做的事情有:
- 调用 init 方法进行建库建表
- 但是由于我们的 init 方法是手动获取bean对象的,需要依赖context ,所以我们这里要先把context对象先搞出来
实现代码如下:
// 使用这个方法, 来执行准备工作. 每个用例执行前, 都要调用这个方法. @BeforeEach public void setUp() { // 由于在 init 中, 需要通过 context 对象拿到 metaMapper 实例的. // 所以就需要先把 context 对象给搞出来. MqApplication.context = SpringApplication.run(MqApplication.class); dataBaseManager.init(); }
使用@AfterEach
来进行收尾工作
此处我们要做的工作有:
- 这里要进行的操作, 就是把数据库给清空~~ (把数据库文件,meta.db 直接删了就行了)
- 但是,请注意, 此处不能直接就删除, 而需要先关闭上述 context 对象
- 而此处的 context 对象, 持有了 MetaMapper 的实例,MetaMapper 实例又打开了 meta.db 数据库文件.
- 如果 meta.db 被别人打开了, 此时的删除文件操作是不会成功的 (Windows 系统的限制, Linux 则没这个问题).
- 另一方面, 获取 context 操作, 会占用 8080 端口. 此处的 close 也是释放 8080.
所以我们需要进行关闭context对象之后,再进行删除删表操作
代码实现如下:
@AfterEach public void tearDown() { // 这里要进行的操作, 就是把数据库给清空~~ (把数据库文件, meta.db 直接删了就行了) // 注意, 此处不能直接就删除, 而需要先关闭上述 context 对象!! // 此处的 context 对象, 持有了 MetaMapper 的实例, MetaMapper 实例又打开了 meta.db 数据库文件. // 如果 meta.db 被别人打开了, 此时的删除文件操作是不会成功的 (Windows 系统的限制, Linux 则没这个问题). // 另一方面, 获取 context 操作, 会占用 8080 端口. 此处的 close 也是释放 8080. MqApplication.context.close(); dataBaseManager.deleteDB(); }
🎍书写测试代码
这里的测试代码逻辑简单,一一进行测试就好,这里我就不进行讲解
这里有一点需要注意的是,我们在观察结果的时候,我们可以使用打印到控制台的方式进行观察,但是这样难免不准确或不易观察
这里我们使用断言操作进行判断,使用方法如下:
Assertions.assertEquals(expected, actual);
我们只需要在这里面添加我们所需要比对的参数就好,那个在前那个在后不重要
- 但是 assertEquals 的形参, 第一个形参叫做 expected (预期的), 第二个形参叫做 actual (实际的)
具体使用看个人习惯
需要注意的是:
- 正确使用断言后,如果测试代码没有出现问题,说明测试通过
- 如果预期值与实际值不符合,就会进行报错,如下图所示
如此一来我们便可以进行测试了
测试代码如下;
@Test public void testInitTable() { // 由于 init 方法, 已经在上面 setUp 中调用过了. 直接在测试用例代码中, 检查当前的数据库状态即可. // 直接从数据库中查询. 看数据是否符合预期. // 查交换机表, 里面应该有一个数据(匿名的 exchange); 查队列表, 没有数据; 查绑定表, 没有数据. List<Exchange> exchangeList = dataBaseManager.selectAllExchanges(); List<MSGQueue> queueList = dataBaseManager.selectAllQueues(); List<Binding> bindingList = dataBaseManager.selectAllBindings(); // 直接打印结果, 通过肉眼来检查结果, 固然也可以. 但是不优雅, 不方便. // 更好的办法是使用断言. // System.out.println(exchangeList.size()); // assertEquals 判定结果是不是相等. // 注意这俩参数的顺序. 虽然比较相等, 谁在前谁在后, 无所谓. // 但是 assertEquals 的形参, 第一个形参叫做 expected (预期的), 第二个形参叫做 actual (实际的) Assertions.assertEquals(1, exchangeList.size()); Assertions.assertEquals("", exchangeList.get(0).getName()); Assertions.assertEquals(ExchangeType.DIRECT, exchangeList.get(0).getType()); Assertions.assertEquals(0, queueList.size()); Assertions.assertEquals(0, bindingList.size()); } private Exchange createTestExchange(String exchangeName) { Exchange exchange = new Exchange(); exchange.setName(exchangeName); exchange.setType(ExchangeType.FANOUT); exchange.setAutoDelete(false); exchange.setDurable(true); exchange.setArguments("aaa", 1); exchange.setArguments("bbb", 2); return exchange; } @Test public void testInsertExchange() { // 构造一个 Exchange 对象, 插入到数据库中. 再查询出来, 看结果是否符合预期. Exchange exchange = createTestExchange("testExchange"); dataBaseManager.insertExchange(exchange); // 插入完毕之后, 查询结果 List<Exchange> exchangeList = dataBaseManager.selectAllExchanges(); Assertions.assertEquals(2, exchangeList.size()); Exchange newExchange = exchangeList.get(1); Assertions.assertEquals("testExchange", newExchange.getName()); Assertions.assertEquals(ExchangeType.FANOUT, newExchange.getType()); Assertions.assertEquals(false, newExchange.isAutoDelete()); Assertions.assertEquals(true, newExchange.isDurable()); Assertions.assertEquals(1, newExchange.getArguments("aaa")); Assertions.assertEquals(2, newExchange.getArguments("bbb")); } @Test public void testDeleteExchange() { // 先构造一个交换机, 插入数据库; 然后再按照名字删除即可! Exchange exchange = createTestExchange("testExchange"); dataBaseManager.insertExchange(exchange); List<Exchange> exchangeList = dataBaseManager.selectAllExchanges(); Assertions.assertEquals(2, exchangeList.size()); Assertions.assertEquals("testExchange", exchangeList.get(1).getName()); // 进行删除操作 dataBaseManager.deleteExchange("testExchange"); // 再次查询 exchangeList = dataBaseManager.selectAllExchanges(); Assertions.assertEquals(1, exchangeList.size()); Assertions.assertEquals("", exchangeList.get(0).getName()); } private MSGQueue createTestQueue(String queueName) { MSGQueue queue = new MSGQueue(); queue.setName(queueName); queue.setDurable(true); queue.setAutoDelete(false); queue.setExclusive(false); queue.setArguments("aaa", 1); queue.setArguments("bbb", 2); return queue; } @Test public void testInsertQueue() { //构造队列对象 MSGQueue queue = createTestQueue("testQueue"); dataBaseManager.insertQueue(queue); List<MSGQueue> queueList = dataBaseManager.selectAllQueues(); Assertions.assertEquals(1, queueList.size()); MSGQueue newQueue = queueList.get(0); Assertions.assertEquals("testQueue", newQueue.getName()); Assertions.assertEquals(true, newQueue.isDurable()); Assertions.assertEquals(false, newQueue.isAutoDelete()); Assertions.assertEquals(false, newQueue.isExclusive()); Assertions.assertEquals(1, newQueue.getArguments("aaa")); Assertions.assertEquals(2, newQueue.getArguments("bbb")); } @Test public void testDeleteQueue() { MSGQueue queue = createTestQueue("testQueue"); dataBaseManager.insertQueue(queue); List<MSGQueue> queueList = dataBaseManager.selectAllQueues(); Assertions.assertEquals(1, queueList.size()); // 进行删除 dataBaseManager.deleteQueue("testQueue"); queueList = dataBaseManager.selectAllQueues(); Assertions.assertEquals(0, queueList.size()); } private Binding createTestBinding(String exchangeName, String queueName) { Binding binding = new Binding(); binding.setExchangeName(exchangeName); binding.setQueueName(queueName); binding.setBindingKey("testBindingKey"); return binding; } @Test public void testInsertBinding() { Binding binding = createTestBinding("testExchange", "testQueue"); dataBaseManager.insertBinding(binding); List<Binding> bindingList = dataBaseManager.selectAllBindings(); Assertions.assertEquals(1, bindingList.size()); Assertions.assertEquals("testExchange", bindingList.get(0).getExchangeName()); Assertions.assertEquals("testQueue", bindingList.get(0).getQueueName()); Assertions.assertEquals("testBindingKey", bindingList.get(0).getBindingKey()); } @Test public void testDeleteBinding() { Binding binding = createTestBinding("testExchange", "testQueue"); dataBaseManager.insertBinding(binding); List<Binding> bindingList = dataBaseManager.selectAllBindings(); Assertions.assertEquals(1, bindingList.size()); // 删除 Binding toDeleteBinding = createTestBinding("testExchange", "testQueue"); dataBaseManager.deleteBinding(toDeleteBinding); bindingList = dataBaseManager.selectAllBindings(); Assertions.assertEquals(0, bindingList.size()); }
⭕总结
关于《【消息队列开发】实现DataBaseManagerTests(测试单元》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!