Отдельный файл liquibase с тестовыми данными для каждого тестового класса в Spring Boot - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу разделить данные теста для конкретного теста.Например, у нас есть два тестовых класса 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)

в тестовом классе.

1 Ответ

0 голосов
/ 21 февраля 2019

Я нашел решение, используя @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");
}
...