欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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个办法:

  1. 将我的更新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);
    }
    

    ​ 结果:测试通过。

  2. 我们可以看到,在想虚拟数据库预存数据的时候,是有一条语句 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());
    }
    

    ​ 结果:测试通过。