package cn.zifangsky.example.webexercise.dataSource;
import cn.zifangsky.example.webexercise.mapper.UserInfoDynamicMapper2;
import cn.zifangsky.example.webexercise.mapper.UserInfoMapper;
import cn.zifangsky.example.webexercise.model.UserInfo;
import org.junit.jupiter.api.*;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.transaction.annotation.Transactional;
import java.sql.SQLException;
/**
* 测试动态切换数据源(Dynamic Datasource Spring Boot Starter)
*
* @author zifangsky
* @date 2020/11/6
* @since 1.0.0
*/
@DisplayName("测试动态切换数据源(Dynamic Datasource Spring Boot Starter)")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class DynamicDataSource2Test {
@Autowired
private UserInfoMapper userInfoMapper;
@Autowired
private UserInfoDynamicMapper2 userInfoDynamicMapper2;
@Test
@Order(1)
@DisplayName("普通方法——使用默认数据源")
public void testCommonMethod(){
UserInfo userInfo = userInfoMapper.selectByPrimaryKey(1);
Assertions.assertNotNull(userInfo);
Assertions.assertEquals("张三", userInfo.getName());
}
@Test
@Order(2)
@DisplayName("通过默认数据源查询,方法级别的注解优先级更高")
public void testSelectByDefaultDataSource(){
UserInfo userInfo = userInfoDynamicMapper2.selectByDefaultDataSource(1);
Assertions.assertNotNull(userInfo);
Assertions.assertEquals("张三", userInfo.getName());
}
@Test
@Order(3)
@DisplayName("方法级别没有添加注解,则使用接口级别的注解,通过 db02 数据源查询")
public void testSelectByDB02DataSource(){
UserInfo userInfo = userInfoDynamicMapper2.selectByDB02DataSource(1);
Assertions.assertNotNull(userInfo);
Assertions.assertEquals("王五", userInfo.getName());
}
@Test
@Order(4)
@DisplayName("方法级别添加注解,手动指定通过 db03 数据源查询")
public void testSelectByDB03DataSource(){
UserInfo userInfo = userInfoDynamicMapper2.selectByDB03DataSource(1);
Assertions.assertNotNull(userInfo);
Assertions.assertEquals("孙七", userInfo.getName());
}
@Test
@Order(5)
@DisplayName("在一个方法执行过程中嵌套操作多个数据源的情况")
public void testNestedMultiDataSource(){
//1. 从 db02 查询一条数据
UserInfo userInfo = userInfoDynamicMapper2.selectByDB02DataSource(1);
//2. 插入到 db03
userInfo.setId(null);
userInfoDynamicMapper2.addToDB03(userInfo);
}
@Test
@Order(6)
@DisplayName("从 db03 数据源删除数据")
public void testDeleteFromDB03ByName(){
userInfoDynamicMapper2.deleteFromDB03ByName("王五");
}
@Test
@Order(7)
@DisplayName("嵌套多个数据源的事务回滚情况")
@Transactional(rollbackFor = Exception.class)
public void testTransaction() throws SQLException {
//1. 从 db01 查询一条数据
UserInfo userInfo = userInfoDynamicMapper2.selectByDefaultDataSource(1);
//2. 分别插入到 db02 和 db03
userInfo.setId(null);
userInfoDynamicMapper2.addToDB02(userInfo);
userInfoDynamicMapper2.addToDB03(userInfo);
//3. 手动抛出一个异常,测试事务回滚效果
throw new SQLException("SQL执行过程中发生某些未知异常");
}
}