关于springboot单元测试执行两次的问题

这篇博客探讨了一次单元测试中遇到的奇怪现象,即在未执行更新操作前,数据库中的密码已被修改。作者通过分析发现,单元测试可能先执行了一次更新,但在没有事务管理的情况下未回滚。为解决此问题,作者引入了@Transactional注解以确保测试后的数据回滚,从而在测试过程中得到预期结果。测试接口显示正常,确认问题出在单元测试上。
摘要由CSDN通过智能技术生成

首先我们有一张表
在这里插入图片描述
这里以修改test为例子

编写测试类

package com.tubai.shiro04_with_spring_boot_1;

import com.tubai.shiro04_with_spring_boot_1.Utils.Md5Util;
import com.tubai.shiro04_with_spring_boot_1.entity.User;
import com.tubai.shiro04_with_spring_boot_1.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class Shiro04WithSpringBoot1ApplicationTests {

    @Autowired
    UserService userService;
    @Test
    void contextLoads() {
        User user = userService.queryByUserName("test");
        String password = user.getPassword();
        System.out.println("password=>"+password);
       	Md5Util.testEncrypt(user);
        userService.updateUser(user);
    }
}

其他部分的代码

public class Md5Util {
    public static void testEncrypt(User user){
        user.setPassword("123");
    }
}
@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public void updateUser(User user) {
        userMapper.updateUser(user);
    }

    @Override
    public User queryByUserName(String username) {
        return userMapper.queryByUserName(username);
    }
}
@Repository
@Mapper
public interface UserMapper {
    User queryByUserName(String username);

    void updateUser(User user);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tubai.shiro04_with_spring_boot_1.mapper.UserMapper">

    <update id="updateUser"
            parameterType="com.tubai.shiro04_with_spring_boot_1.entity.User">
        update `user` set username=#{username},password=#{password},salt=#{salt}
        where id = #{id}
    </update>

    <select id="queryByUserName"
            resultType="com.tubai.shiro04_with_spring_boot_1.entity.User">
        select * from user where username = #{username}
    </select>
</mapper>

开始测试

我们目前的password是’abc’的在这里插入图片描述
然后我们开启调试运行
在这里插入图片描述
我们发现密码并不是abc,已经变成了123

此时还没走到update处

我们前往数据库查看,发现password已经被改掉了
在这里插入图片描述

我推测

这里的单元测试必然会先执行一次 然后再执行一次给我们结果

因此才出现了这么奇怪的现象

测试一下接口

发现是没有任何问题的,因此是单元测试的锅

解决方案

至于怎么解决,,我还没有办法

但是可以加一个注解让其自动回滚

	@Test
    @Transactional
    void contextLoads() {
        User user = userService.queryByUserName("test");
        String password = user.getPassword();
        System.out.println("password=>"+password);
        Md5Util.testEncrypt(user);
        userService.updateUser(user);
    }

添加这个注解以后,起码能得到‘abc’,毕竟先前执行的那次也回滚了。

只能这样了,等待解决…

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值