私は春を使用してMVCプロジェクトに取り組んでいるジュニアCSの主要な学生です。メモリデータベースのH2を使用したSpringテストはすべてのテーブルを切り捨てます
メモリデータベースにH2を設定し、2つのSQLスクリプトを書きました。 1つはデータベースを作成し、もう1つはデータベースを空にします。
私が知る限り、truncate table <table name>
とdelete from <table name>
の実用的な違いは、truncate tableがddlであることです。そのため、自動インクリメントの列もリセットされます。問題は、H2の切り捨てテーブルが自動インクリメントされたカラムをリセットしないことです。私がうんざりしているところを指摘できますか?
私は、春のSqlGroup注釈を使用してスクリプトを実行しています。
@SqlGroup({
@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts =
"classpath:populate.sql"),
@Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts =
"classpath:cleanup.sql")
})
ここで、すべてのテーブルを切り捨てるはずのcleanup.sqlがあります。
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE `criteria`;
TRUNCATE TABLE `job_title`;
TRUNCATE TABLE `organization`;
TRUNCATE TABLE `organization_teams`;
TRUNCATE TABLE `organization_users`;
TRUNCATE TABLE `organization_job_titles`;
TRUNCATE TABLE `review`;
TRUNCATE TABLE `review_evaluation`;
TRUNCATE TABLE `team`;
TRUNCATE TABLE `team_members`;
TRUNCATE TABLE `user`;
TRUNCATE TABLE `user_criteria_list`;
SET FOREIGN_KEY_CHECKS=1;
populate.sqlは、整合性制約に違反することなく、これらのテーブルに一連の行を挿入するだけです。
私はテストクラスを実行するので、最初のメソッドだけが渡されます。残りのために私はこのようなものを得る:
参照整合性制約違反を: "FK3MAB5XYC980PSHDJ3JJ6XNMMT:PUBLIC.ORGANIZATION_JOB_TITLES FOREIGN KEY(JOB_TITLES_ID)がPUBLIC.JOB_TITLE(ID)を参照(1)"; SQL文:organization_job_titles
(ORGANIZATION_ID、job_titles_id)INTO INSERT VALUES(1、1)
私はこの問題は、リセットされていない自動インクリメント列から生じたと思いました。だから私は、別のテストクラスを書い:
monAutoIncTest.java
@Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts =
"classpath:truncateTable.sql")
public class monAutoIncTest {
@Autowired
OrganizationService organizationService;
@Test
public void h2truncate_pls() throws BaseException {
organizationService.add(new Organization("Doogle"));
Organization fetched = organizationService.getByName("Doogle");
Assert.assertEquals(1, fetched.getId());
}
@Test
public void h2truncate_plz() throws BaseException {
organizationService.add(new Organization("Zoogle"));
Organization fetched = organizationService.getByName("Zoogle");
Assert.assertEquals(1, fetched.getId());
}
}
最初のパスを実行し、他方が与えているtruncateTable.sql
SET FOREIGN_KEY_CHECKS=0;
TRUNCATE TABLE `organization`;
SET FOREIGN_KEY_CHECKS=1;
テストが実行されると、どちらの方法で私はこれ。
にjava.lang.AssertionError: 予想:1 実際:2
です。これは驚異的でした。 – Felicyta