doilux’s tech blog

ITに関する備忘録。 DDP : http://doiluxng.hatenablog.com/entry/2018/01/01/195409

SpringでDBのテストをするときにシーケンスがロールバックされない問題に対応する

SpringでDBのテストをするときに@Transactionalをつけるとテストメソッドの実行が終わるたびにロールバックしてくれるので便利なんですが、シーケンスがロールバックされないでテストがコケるという問題があります。

解決策は単純でsetupでシーケンスの初期化をすればいいだけ。

MySQLだとこんな感じです。

@SpringBootTest
class EmployeeTableMapperTest extends Specification {

    @Autowired
    private EmployeeTableMapper sut

    @Autowired
    private JdbcTemplate jdbcTemplate

    @Transactional
    def "test"() {
        setup:
        jdbcTemplate.execute("ALTER TABLE employee_register_events AUTO_INCREMENT = 1")
        def genId = new GeneratedEmployeeId()

        when:
        sut.insert(new EmployeeRegisterEvent("shown", "white", 200000), genId)

        then:
        sut.select(genId.convert()) == [
                "id"        : 1,
                "first_name": "shown",
                "last_name" : "white",
                "salary"    : 200000
        ]
    }
}