springboot~對mybatis的start包進行(xing)單元測(ce)試
一個start包,它不需要有springboot啟動類,它只提供一切公用的功能,被其它包依賴就行了,通過META-INF/spring.factories或者META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports來自動(dong)注入(ru)就可以(yi)了,我們以(yi)mybatis的start包為例,說一下如何進(jin)行單(dan)元測試。
測試項目結果

兩個實體,方便進行事務測試
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("user")
public class User extends BaseEntity {
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
@NotBlank(message = "名稱不能為空")
private String username;
}
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("user_attribute")
public class UserAttribute extends BaseEntity {
@TableId(value = "id", type = IdType.ASSIGN_ID)
private String id;
@TableField("user_id")
private String userId;
@NotBlank(message = "名稱不能為空")
private String name;
@NotBlank(message = "值不能為空")
private String value;
}
兩個mapper類,進行實體持久化
public interface UserMapper extends BaseMapper<User> {
}
public interface UserAttributeMapper extends BaseMapper<UserAttribute> {
}
一個service類,進行事務管理
@Component
public class UserService implements IUserService {
@Autowired
UserMapper userMapper;
@Autowired
UserAttributeMapper userAttributeMapper;
@Transactional(rollbackFor = { Exception.class })
@Override
public void insertUser() {
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setUsername("zzl4");
userMapper.insert(user);
UserAttribute userAttribute = new UserAttribute();
userAttribute.setId(UUID.randomUUID().toString());
userAttribute.setUserId(user.getId());
userAttribute.setName("realName");
userAttribute.setValue("占占");
userAttributeMapper.insert(userAttribute);
}
}
核心測試類,通過手動注入bean,來實現測試mybatis組成的能力
@EnableTransactionManagement表(biao)示開啟事務;DataSourceTransactionManagerAutoConfiguration是自(zi)動注入事務需要的(de)bean
@EnableTransactionManagement
@SpringBootTest(classes = { MybatisAutoConfiguration.class, DataSourceAutoConfiguration.class,
MybatisPlusAutoConfiguration.class, DataSource.class, SqlSessionFactory.class,
DataSourceTransactionManagerAutoConfiguration.class, UserService.class })
@MapperScan(basePackages = "com.lind.common.mybatis.mapper")
public class CurdTest {
@Autowired
UserMapper userMapper;
@Autowired
IUserService userService;
@Test
public void insert() throws IOException {
User user = new User();
user.setId(UUID.randomUUID().toString());
user.setUsername("zzl");
userMapper.insert(user);
}
/**
* @DataSourceTransactionManagerAutoConfiguration 注入事務所需的bean
* @throws IOException
*/
@Test
public void trans() throws IOException {
// 開啟事務:@EnableTransactionManagement,注入事務的bean:DataSourceTransactionManagerAutoConfiguration
// 事務需要在新的bean中,不需要在單元測試中直接使用@Transactional
// 使用@Transactional注解都是用在類的方法上。官網也不建議使用在接口類上面,注解肯定都是用到了aop的思想,即使用了動態代理。而如果使用cglib動態代理肯定沒有辦法代理接口類
userService.insertUser();
}
}
測試類不需要RunWith了,@SpringBootTest直接集成了@ExtendWith注解
