我想分开特定测试的测试数据。例如,我们有两个测试类A和B,它们运行在不同的数据上,因此我想创建ATestData.xml和BTestData.xml,当测试类启动时,它应该执行ATestData.xml然后回滚然后启动测试B执行BTestData.xml。在Arquillian Persistence Extension中有@UsingDataSet("datasets/users.yml")
。
我开始编写自己的注释:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface LiquibaseTestDataFile {
String value() default "";
}
和
@Slf4j
@Aspect
@Component
public class LiquibaseTestDataFileAspect {
@Before("execution(* (@LiquibaseTestDataFile *).*(..)) || execution(@LiquibaseTestDataFile * *(..))")
public void insertTestData(JoinPoint joinPoint){
log.info("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB");
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Class<?> declaringClass = signature.getMethod().getDeclaringClass();
LiquibaseTestDataFile myAnnotation = declaringClass.getAnnotation(LiquibaseTestDataFile.class);
//TODO if null maybe on method
//log.info(myAnnotation.value());
}
}
但是,当注释在测试类上时,它不会发生变化。
我在配置中使用@EnableAspectJAutoProxy
和
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {TransferManagerRestApplication.class})
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
在测试课上。
我通过使用@PostConstruct
找到解决方案
@Component
public class LiquibaseDataTestConfiguration {
@Autowired
private SpringLiquibase springLiquibase;
public void insert(String fileName){
try {
Connection connection = springLiquibase.getDataSource().getConnection();
Database database = DatabaseFactory.getInstance().findCorrectDatabaseImplementation(new JdbcConnection(connection));
Liquibase liquibase = new liquibase.Liquibase(fileName, new ClassLoaderResourceAccessor(), database);
liquibase.update(new Contexts(springLiquibase.getContexts()), new LabelExpression(springLiquibase.getLabels()));
} catch (LiquibaseException | SQLException e) {
e.printStackTrace();
}
}
}
在测试课上
@Autowired
private LiquibaseDataTestConfiguration liquibaseDataTestConfiguration;
@PostConstruct
public void initData(){
liquibaseDataTestConfiguration.insert("liquibase/AClassTest.xml");
}