質問者のレベル感
エンジニア歴3ヶ月目の駆け出しエンジニアです。
Junitは四則演算程度ならばテストコードを記述できますが、SpringFWで作成したアプリケーションのテストコードを記述するのは初めてです。
事象
Junitテストを実行すると以下のエラーが発生します。
java.lang.IllegalStateException: Failed to load ApplicationContext [中略] Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webSecurityConfig': Unsatisfied dependency expressed through field 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #2 of URL [file:/Users/macpc/Documents/workspace-spring-tool-suite-4-4.6.0.RELEASE/OriginalApplication/target/test-classes/schema.sql]: CREATE TABLE `supporter` ( `supporter_id` int NOT NULL AUTO_INCREMENT, `supporter_name` varchar(255) NOT NULL, `owner_name` varchar(255) NOT NULL, `postalcode` varchar(255) NOT NULL, `address` varchar(255) NOT NULL, `phonenumber` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `temple_id` int NOT NULL, foreign key supporter(temple_id) references temple(id), PRIMARY KEY (`supporter_id`) ); nested exception is org.h2.jdbc.JdbcSQLException: SQLステートメントに文法エラーがあります "CREATE TABLE ""SUPPORTER"" ( ""SUPPORTER_ID"" INT NOT NULL AUTO_INCREMENT, ""SUPPORTER_NAME"" VARCHAR(255) NOT NULL, ""OWNER_NAME"" VARCHAR(255) NOT NULL, ""POSTALCODE"" VARCHAR(255) NOT NULL, ""ADDRESS"" VARCHAR(255) NOT NULL, ""PHONENUMBER"" VARCHAR(255) NOT NULL, ""EMAIL"" VARCHAR(255) NOT NULL, ""TEMPLE_ID"" INT NOT NULL, FOREIGN KEY SUPPORTER[*](TEMPLE_ID) REFERENCES TEMPLE(ID), PRIMARY KEY (""SUPPORTER_ID"") ) "; 期待されるステートメント "(" Syntax error in SQL statement "CREATE TABLE ""SUPPORTER"" ( ""SUPPORTER_ID"" INT NOT NULL AUTO_INCREMENT, ""SUPPORTER_NAME"" VARCHAR(255) NOT NULL, ""OWNER_NAME"" VARCHAR(255) NOT NULL, ""POSTALCODE"" VARCHAR(255) NOT NULL, ""ADDRESS"" VARCHAR(255) NOT NULL, ""PHONENUMBER"" VARCHAR(255) NOT NULL, ""EMAIL"" VARCHAR(255) NOT NULL, ""TEMPLE_ID"" INT NOT NULL, FOREIGN KEY SUPPORTER[*](TEMPLE_ID) REFERENCES TEMPLE(ID), PRIMARY KEY (""SUPPORTER_ID"") ) "; expected "("; SQL statement: CREATE TABLE `supporter` ( `supporter_id` int NOT NULL AUTO_INCREMENT, `supporter_name` varchar(255) NOT NULL, `owner_name` varchar(255) NOT NULL, `postalcode` varchar(255) NOT NULL, `address` varchar(255) NOT NULL, `phonenumber` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `temple_id` int NOT NULL, foreign key supporter(temple_id) references temple(id), PRIMARY KEY (`supporter_id`) ) [42001-197]
原因または解決策をご存知の方はいらっしゃいませんか。
@TestPropertySourceアノテーションを付与した所以上のエラーが発生します。
また、エラー本文内のcaused by以降に引用されているSQL文ですが、
sqema.sqlファイル内に記述されているSQL文と違った内容のものが読み込まれてエラーを吐いている状態です。
現状は、test/resources直下のpropertyファイルを読み込む所までは正常に起動しており、
その後の処理で別のsqlファイルを読み込んでしまっていると考えております。
質問内容
- 私の考察は間違っていないか
- 間違っていないとしたら、sqlファイルを正しく読み込めていない原因は何か?
- エラー文に引用されているSQL文にダブルクォーテーションが余分に付いているように見えるが、これはどういった現象なのか
以上よろしくお願い致します。
コード
Java
1package com.example.demo.controller; 2【import文省略】 3@Transactional 4@SpringBootTest 5@TestPropertySource(locations = "classpath:test.properties") 6@AutoConfigureMockMvc 7public class TempleControllerTest { 8 9 @MockBean 10 TempleService templeServiceMock; 11 12 @Autowired 13 private MockMvc mockMvc; 14 15 @Test 16 public void 寺院登録用フォームが表示されること() throws Exception { 17 mockMvc.perform(get("/signup")) 18 .andExpect(status().isOk()) 19 .andExpect(view().name("register/signup.html")); 20 } 21 @Test 22 public void 新規登録が完了したら画面遷移すること() throws Exception { 23 mockMvc.perform(post("/signup").param("password", "yudainoda").param("templeName", "林床寺") 24 .param ("denpmination","臨済宗").param("monkName", "野田義男") 25 .param("position", "住職").param("postalcode", "444-4444") 26 .param("address", "愛知県春日井市").param("email", "noda@gmail.com")) 27 .andExpect(status().isOk()) 28 .andExpect(flash().attribute("success", "登録が完了しました")); 29 } 30
[test.properties] spring.datasource.driver-class-name=org.h2.Driver spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL; spring.datasource.username= spring.datasource.password= spring.datasource.data=classpath:schema.sql
SQL
1[schema.sql] 2 3CREATE TABLE `temple` 4( 5 `id` int NOT NULL AUTO_INCREMENT, 6 `temple_id` varchar(255) NOT NULL, 7 `password` varchar(255) NOT NULL, 8 `temple_name` varchar(255) NOT NULL, 9 `denomination` varchar(255) NOT NULL, 10 `monk_name` varchar(255) NOT NULL, 11 `position` varchar(255) NOT NULL, 12 `postalcode` varchar(255) NOT NULL, 13 `address` varchar(255) NOT NULL, 14 `email` varchar(255) NOT NULL, 15 `role` varchar(32) , 16 PRIMARY KEY (`id`) 17); 18
回答1件
あなたの回答
tips
プレビュー