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