我让这个micronaut应用程序进行一些基本的数据库查找,仅用于测试框架。我已经通过flyway数据库迁移设置了应用程序,并在测试设置中运行了h2数据库(生产使用了postgresql)。这用于正确设置架构。
我的存储库是使用jpa的Micronaut数据创建的,因此,如果不在完整的micronaut上下文中运行测试,我不知道如何创建它。
在我的测试中,在执行一些spock测试之前,我尝试在setup方法中插入一些数据。安装程序运行一次后,我希望它从一个干净的数据源开始,以进行下一个测试执行。由于数据将违反唯一约束,因此在运行第二项测试的安装程序中,它将因SQL错误而失败。这是我的代码:
@MicronautTest() class CompanyRepositoryTest extends Specification { @Inject CompanyRepository repository @Inject DataSource dataSource def sql def setup() { sql = new Sql(dataSource: dataSource) sql.execute(dataSql) } def 'test company creation' () { given: def name = 'test2' def orgNumber = '1232429045' when: def company = repository.save(new Company(name: name, organizationNumber: orgNumber)) then: company.id != null } @Unroll def 'get company for #desc'() { when: Company result = repository.find(id) then: name == null ? result == null : name == result.name where: id | name | desc 1 | 'test1' | 'existing company' 2 | null | 'non-existing company' } def dataSql = """ insert into company(name, organization_number) values ('test1', '1232429045'); """
我想我可以在执行delete语句的地方创建一个清理块,但是我认为这是最后的选择,因为我希望每次测试运行前数据源都是干净的。
我让这个micronaut应用程序进行一些基本的数据库查找,仅用于测试框架。我已经通过flyway数据库迁移设置了应用程序,并在测试设置中运行了h2数据库...
经过一夜的睡眠,一个明显的答案来到了我身边。我不是通过groovy sql执行sql,而是使用entitymanager。然后按预期工作]