我有一系列的集成测试可以单独运行,但作为一个组,它们会因主键违规而失败。
以下是两个示例测试:
class AddressPopulatorTest extends BaseSpecification {
@Autowired
private AddressRepository addressRepository
@Autowired
private AddressPopulator addressPopulator;
def "test address list is retrieved from Treasury.gov"() {
when:
def count = addressPopulator.populate();
then:
def sdnList = addressRepository.findAll()
sdnList.size() > 5000
sdnList.size() == count
}
}
和
class SdnPopulatorTest extends BaseSpecification {
@Autowired
private SdnRepository sdnRepository
@Autowired
private SdnPopulator sdnPopulator;
def "test sdn list is retrieved from Treasury.gov"() {
when:
def count = sdnPopulator.populate();
then:
def sdnList = sdnRepository.findAll()
sdnList.size() > 5000
sdnList.size() == count
}
这是我希望只需一次初始化所有内容的基类:
@ContextConfiguration(classes = MyClass, loader = SpringApplicationContextLoader)
@Transactional
@IntegrationTest
public class BaseSpecification extends Specification {
}
但是,每个测试似乎都在尝试使用schema.sql创建数据库,并使用data.sql文件填充安全用户表。我认为基础测试类只会这样做一次,而不是每次测试。我的schema.sql可以检查现有表,如果存在则不创建
以下是第一次测试后每次测试发生的异常:
Caused by: org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "PRIMARY_KEY_4 ON PUBLIC.USERS(USERNAME)"; SQL statement:
INSERT INTO users (username, password, enabled) VALUES ('admin', '$2a$10$GVPAMYRozI08Mcll5too6.Q4M2jTO0iJVoiaVDv9pMxRqTpxNj9vO', TRUE) [23505-172]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
at org.h2.message.DbException.get(DbException.java:169)
at org.h2.message.DbException.get(DbException.java:146)
at org.h2.index.BaseIndex.getDuplicateKeyException(BaseIndex.java:83)
at org.h2.index.TreeIndex.add(TreeIndex.java:65)
at org.h2.table.RegularTable.addRow(RegularTable.java:124)
at org.h2.command.dml.Insert.insertRows(Insert.java:126)
at org.h2.command.dml.Insert.update(Insert.java:86)
at org.h2.command.CommandContainer.update(CommandContainer.java:79)
at org.h2.command.Command.executeUpdate(Command.java:235)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:180)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:155)
at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:459)
有没有办法用schema.sql&创建所有数据库表? data.sql在测试开始时插入一次,因为我认为这似乎是问题所在。或者我对这个错误的态度?