質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

12990閲覧

Junitでデータベースの検証を行いたい

NodaYudai

総合スコア8

JUnit

JUnitは、Javaで開発されたプログラムのユニットテストを行うためのアプリケーションフレームワークです。簡単にプログラムのユニットテストを自動化することができ、結果もわかりやすく表示されるため効率的に開発時間を短縮できます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

1クリップ

投稿2020/08/05 07:28

質問者のレベル感

エンジニア歴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; 2import文省略】 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

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yasumichi

2020/08/05 11:24

schema.sql でカラム名等を `` で囲っていますが、あまり、予約語が入っているようには見えません。 特に必要なければ、使わない方が良さそうな気がします。
Yasumichi

2020/08/05 11:36

なお、現状、OriginalApplication/target/test-classes/schema.sql の内容は、OriginalApplication/src/test/resources/schema.sql と同じ内容になってますでしょうか?
Yasumichi

2020/08/05 11:52

spring.datasource.data ではなく、spring.datasource.schema を指定すべきではないでしょうか。
guest

回答1

0

ベストアンサー

はずしてたらごめんなさい。

src/main/resources/schema.sql の方が使用されていると思われます。

追試してみたところ、test.properties の

properties

1spring.datasource.data=classpath:schema.sql

properties

1spring.datasource.schema=classpath:schema.sql

に変更することでデータソースの例外は出なくなりました。

spring.datasource.data は、テーブル作成後に投入する INSERT 文などを実行する場合に使用します。

なお、

sql

1CREATE TABLE `supporter` 2( 34foreign key supporter(temple_id) references temple(id), 56);

foreign key の後のに自身の名称 supporter を指定していますが、fk_temple など他に存在しない名前を指定する必要があると思います。

Spring Boot + Spring JDBC で MySQL に接続するための設定 - Qiita

投稿2020/08/05 11:55

編集2020/08/05 13:18
Yasumichi

総合スコア1773

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NodaYudai

2020/08/06 02:09 編集

ご丁寧にご回答いただきありがとうございます。 上記の問題はpropetiesファイルの指摘通り解決されました。 確認不足でした。 厚かましくて申し訳ないのですが、続いて以下のエラーが発生しております。 java.lang.IllegalStateException: Failed to load ApplicationContext Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Found non-empty schema(s) "PUBLIC" but no schema history table. Use baseline() or set baselineOnMigrate to true to initialize the schema history table. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:226) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:310) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:893) at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:879) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:551) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ... 65 more Caused by: org.flywaydb.core.api.FlywayException: Found non-empty schema(s) "PUBLIC" but no schema history table. Use baseline() or set baselineOnMigrate to true to initialize the schema history table. at org.flywaydb.core.Flyway$1.execute(Flyway.java:187) at org.flywaydb.core.Flyway$1.execute(Flyway.java:159) at org.flywaydb.core.Flyway.execute(Flyway.java:530) at org.flywaydb.core.Flyway.migrate(Flyway.java:159) at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:65) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ... 83 more マイグレーション管理用テーブルが存在しないことが原因なのではないかという所までは分かったのですが、 flywayを用いたマイグレーションに関する知識が不足しておりまして、configファイルを作成するなどを行ってみましたが上手くいかず、何をどうすればいいのかが分からない状態です。 もし知見がございましたらアドバイスなど頂けますと幸いです。
Yasumichi

2020/08/06 07:42 編集

残念ながら、Flyway は詳しくないのですが、DB migration 用の SQL とか、どうなっていますでしょうか。 また、既存のテーブルを削除して良いなら、削除すれば良さそうです。 Flyway:マイグレーションエラー(テーブルのあるスキーマ) - Web開発など https://web-dev.hatenablog.com/entry/java/db-access/lib/flyway/error-non-empty-schema 後、以下も参考になるかも。 spring boot - Flyway: Found non-empty schema(s) "public" without schema history table! Use baseline() - on Empty database - Stack Overflow https://stackoverflow.com/questions/53172123/flyway-found-non-empty-schemas-public-without-schema-history-table-use-bas できれば、質問を切り分けた方が良いかもしれません。
NodaYudai

2020/08/06 09:54

ご丁寧にありがとうございます。 まずは問題を切り分け解決を試みようと思います。 今回は誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問