Spring security 带spring安全集成测试的spring引导

Spring security 带spring安全集成测试的spring引导,spring-security,spring-boot,spring-test,Spring Security,Spring Boot,Spring Test,我有一系列单独运行良好的集成测试,但作为一个组,它们会因主键冲突而失败 以下是两个示例测试: class AddressPopulatorTest extends BaseSpecification { @Autowired private AddressRepository addressRepository @Autowired private AddressPopulator addressPopulator; def "test addres

我有一系列单独运行良好的集成测试,但作为一个组,它们会因主键冲突而失败

以下是两个示例测试:

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
    }
}

下面是基类,我希望它能初始化所有东西一次:

@ContextConfiguration(classes = MyClass, loader = SpringApplicationContextLoader)
@Transactional
@IntegrationTest
public class BaseSpecification extends Specification {
}
但是,每个测试似乎都试图使用schema.sql创建数据库,并使用data.sql文件填充security users表。我以为基本测试类只会做一次,而不是每次测试。My 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插入创建所有数据库表一次,我认为这似乎是问题所在。或者我的方法是错误的?

Normal
@ContextConfiguration
,我认为JUnit可以工作(加载程序缓存测试执行之间的上下文)。也许您正在使用的Groovy框架(Spock?)在某种程度上颠覆了这一点?我正在考虑使用Flyway来创建和填充生产和测试的数据库,而不是schema.sql和data.sql。在spring引导示例中,它没有显示如何配置jdbc参数,但我想我只需要在我的资源目录中有一个flyway.properties文件?Dave-我不知道是不是它的Spock导致了这个问题。奇怪的是,每次测试都会创建/填充/销毁表。但是,spring安全表(用户和权限)中似乎仍然有数据,这导致了主要冲突。我没有完全了解最后一点,你的意思是,如果你的Flyway迁移与否,安全表是其中的一部分吗?(我想他们应该是?)你是如何运行Flyway迁移的(我建议你使用Boot 1.1本机支持)?Dave-抱歉,我把这个评论搞错了。我希望使用Flyway或Liquibase来创建我的db表并为其种子,因为我不明白为什么每次测试后安全表都没有清空。我开始在Flyway上工作,但由于缺少URL,我无法让它创建数据源。我在resources/application.properties和resources/flyway.properties中都添加了“flyway.url”,但两次都没有收到。
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)