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

首先我们有一张表
在这里插入图片描述
这里以修改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’,毕竟先前执行的那次也回滚了。

只能这样了,等待解决…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值