springboot~對mybatis的start包進行單元測試

一個start包,它不需要有springboot啓動類,它只提供一切公用的功能,被其它包依賴就行了,通過META-INF/spring.factories或者META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports來自動注入就可以了,我們以mybatis的start包爲例,說一下如何進行單元測試。

測試項目結果

兩個實體,方便進行事務測試

@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表示開啓事務;DataSourceTransactionManagerAutoConfiguration是自動注入事務需要的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註解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章