mockito测试自己写的update更新语句失败
程序员文章站
2022-03-03 19:50:43
...
mockito测试自己写的update更新语句失败
问题描述:
公司要写单元测试,使用的是springboot + mockito + junit去写单元测试,某天在对自己写的更新语句进行测试的时候发现了问题,明明更新语句执行成功了,但是最后进行数据校验的时候确显示没更新,所以报错。
出问题的unit test代码如下:
/**
* 测试更新
* case1:正确修改;
*/
@Test
public void testUpdateCase1() {
// given 先往数据库存入一个实体
Red saveRed = TestUtils.newRed(testRedUuid);
entityManager.persist(saveRed);
entityManager.flush();
String state = "NORMAL";
String uuid = testRedUuid;
// when 执行修改操作
redDAO.updateRedStateByIdAndUuid(state, (Long) entityManager.getId(saveRed), uuid);
// then
Assert.assertEquals(state, saveRed.getState());
}
报错信息:
org.junit.ComparisonFailure: expected:<[NORMAL]> but was:<[WRONG]>
at org.junit.Assert.assertEquals(Assert.java:115)
at org.junit.Assert.assertEquals(Assert.java:144)
at ................
....................
.............................
解决思路
在经过DEBUG后,更新语句执行了,但是虚拟数据库的数据确实没有更新,所以现在想出了2个办法:
-
将我的更新sql语句updateRedStateByIdAndUuid()设定一个返回值,为改变的行数(int),然后assert的时候比的是更新的行数。
思路一的测试代码如下:
/** * 测试更新 * case1:正确修改; */ @Test public void testUpdateCase1() { // given 先往数据库存入一个实体 Red saveRed = TestUtils.newRed(testRedUuid); entityManager.persist(saveRed); entityManager.flush(); String state = "NORMAL"; String uuid = testRedUuid; // when 执行修改操作 int changeLine = redDAO.updateRedStateByIdAndUuid(state, (Long) entityManager.getId(saveRed), uuid); // then Assert.assertEquals(1, changeLine); }
结果:测试通过。
-
我们可以看到,在想虚拟数据库预存数据的时候,是有一条语句
entityManager.flush();
的,那么猜测虚拟数据库进行数据改变后,需要再flush一下。 思路二测试代码如下:
/** * 测试更新 * case1:正确修改; */ @Test public void testUpdateCase1() { // given 先往数据库存入一个实体 Red saveRed = TestUtils.newRed(testRedUuid); entityManager.persist(saveRed); entityManager.flush(); String state = "NORMAL"; String uuid = testRedUuid; // when 执行修改操作 redDAO.updateRedStateByIdAndUuid(state, (Long) entityManager.getId(saveRed), uuid); // 刷新虚拟数据库 entityManager.refresh(saveRed); // then Assert.assertEquals(state, saveRed.getState()); }
结果:测试通过。
上一篇: MongoDB的update更新使用方法
下一篇: MAC 笔记本显示和隐藏文件