在Spring Boot中为每个测试类的测试数据分隔liquibase文件

问题描述 投票:0回答:1

我想分开特定测试的测试数据。例如,我们有两个测试类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)

在测试课上。

spring-boot testing annotations liquibase spring-aop
1个回答
0
投票

我通过使用@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");
}
© www.soinside.com 2019 - 2024. All rights reserved.