首先我们有一张表
这里以修改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’,毕竟先前执行的那次也回滚了。
只能这样了,等待解决…