弹簧安全集成测试的spring-boot

时间:2014-06-16 11:26:57

标签: spring-security spring-boot spring-test

我有一系列的集成测试可以单独运行,但作为一个组,它们会因主键违规而失败。

以下是两个示例测试:

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在测试开始时插入一次,因为我认为这似乎是问题所在。或者我对这个错误的态度?

0 个答案:

没有答案