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

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

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

Jenkinsとは、Apache TomcatなどのServletで動作しているサーバーベースシステムです。Jenkinsはオープンソースであり、LInux,Mac OS X,Windows,Solaris,FreeBSDとOpenBSDのためのパッケージがあります。

JUnit

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

Java

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

Gradle

Gradleは、ビルド自動化ツールです。 ソフトウェアパッケージやドキュメント、 または実際に何か他の種類のプロジェクトの構築、テスト、公開、展開などを自動化が出来ます

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

19195閲覧

SpringBootアプリのビルド・テスト時に、テスト用application.propertiesが読み込まれない

daphnia99

総合スコア24

Jenkins

Jenkinsとは、Apache TomcatなどのServletで動作しているサーバーベースシステムです。Jenkinsはオープンソースであり、LInux,Mac OS X,Windows,Solaris,FreeBSDとOpenBSDのためのパッケージがあります。

JUnit

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

Java

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

Gradle

Gradleは、ビルド自動化ツールです。 ソフトウェアパッケージやドキュメント、 または実際に何か他の種類のプロジェクトの構築、テスト、公開、展開などを自動化が出来ます

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

1グッド

1クリップ

投稿2020/09/10 06:31

#問題と実現したいこと
ビルドサーバーを立て、Jenkinsで./gradlew buildでビルドした際、全てのテストが失敗します。

こちらの記事によれば、test時にはtest/resorces/配下のpropertiesファイルが優先されるとのことです。しかし、下記エラーメッセージにあるように、どうもtest用のtest.propertiesが読み込まれていないようです。

Caused by: java.io.FileNotFoundException: class path resource [test.properties] cannot be opened because it does not exist

ビルド時、どのようにしてテスト用のtest.propertiesを読み込ませ、JUnitによるテストを実施すれば良いでしょうか??

#エラーメッセージ
各テストには下記のようなエラーメッセージがでます。

ErrorMessage

1Java.lang.IllegalStateException: Failed to load ApplicationContext

StackTrace

1Caused by: java.io.FileNotFoundException: class path resource [test.properties] cannot be opened because it does not exist 2 at org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:180) 3 at org.springframework.core.io.support.EncodedResource.getInputStream(EncodedResource.java:159) 4 at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:99) 5 at org.springframework.core.io.support.PropertiesLoaderUtils.fillProperties(PropertiesLoaderUtils.java:73) 6 at org.springframework.core.io.support.PropertiesLoaderUtils.loadProperties(PropertiesLoaderUtils.java:59) 7 at org.springframework.core.io.support.ResourcePropertySource.<init>(ResourcePropertySource.java:86) 8 at org.springframework.test.context.support.TestPropertySourceUtils.addPropertiesFilesToEnvironment(TestPropertySourceUtils.java:192) 9 ... 71 more

#試したこと、確認したこと

  • こちらの記事を参考に、各テストクラスに@SpringBootTestおよび@TestPropertySource(locations = "/test.properties")を記載しました。
  • sMySQLがビルドサーバーにもインストール済みか/該当のデータベースが存在するかを確認しました。

#設定ファイル(test.properties)

properties

1### データベース関連 2spring.datasource.url=jdbc:mysql://localhost:3306/DBname?serverTimezone=JST 3spring.datasource.username=root 4spring.datasource.password=TestTest100! 5spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 6spring.jpa.open-in-view=true 7# (1)初期化を行うかの指定。 8spring.datasource.initialization-mode=always 9# (2)初期化を行う際のモード。この場合は検証のみ。 10spring.jpa.hibernate.ddl-auto=validate 11 12### メッセージ 13spring.messages.basename=messages 14spring.messages.encoding=UTF-8

#環境

  • AmazonLinux2
  • Jenkins
  • SpringBoot 2.2.4
  • gradle6.0
  • MySQL 8.0

ディレクトリ構成はだいたい↓の感じです(上記サイトを引用させてもらいました)。

directory

1/my/good/project 2 ├── README.md 3 ├── pon.xml 4 └── src 5 ├── main 6 │ ├── com 7 │ │ └── ... 8 │ └── resources 9 │ └── application.properties 10 └── test 11 ├── com 12 │ └── ... 13 └── resources 14 └── test.properties 15 └── schema.sql(テスト用データ) 16 └── testdata.sql(テスト用データ)

また、build.gradleも記載いたします。

gradle

1plugins { 2 id 'org.springframework.boot' version '2.2.4.RELEASE' 3 id 'io.spring.dependency-management' version '1.0.9.RELEASE' 4 id 'java' 5 id 'war' 6} 7war { 8 enabled = true 9 archiveName = 'sample.war' 10} 11 12group = 'com.example' 13version = '0.0.1-SNAPSHOT' 14sourceCompatibility = '1.8' 15 16configurations { 17 developmentOnly 18 runtimeClasspath { 19 extendsFrom developmentOnly 20 } 21 compileOnly { 22 extendsFrom annotationProcessor 23 } 24} 25 26~中略~ 27 28dependencies { 29~中略~ 30 runtimeOnly 'mysql:mysql-connector-java' 31 testImplementation 'org.springframework.boot:spring-boot-starter-test' 32} 33 34//画面テストは除外 35test { 36 useJUnitPlatform() 37 exclude 'com/example/demo/ViewTest.class' 38} 39

#作成したテストクラスの例
以下のようなテストクラスを作成しています。

java

1@RunWith(SpringRunner.class) 2@SpringBootTest 3@TestPropertySource(locations = "/test.properties") 4@AutoConfigureMockMvc 5public class BusinessDateServiceImplTest { 6 7 //依存しているDaoをモック化 8 @MockBean 9 BusinessDateDao mockDao; 10 11 @Autowired 12 BusinessDateService businessDateService; 13 14 15 @Test 16 public void 一件登録が機能する()throws Exception{ 17 //テスト用の空のEntityクラス用意 18 BusinessDate businessDate = new BusinessDate(); 19 20 //Daoのvoidメソッドが実行されることを設定(void) 21 doNothing().when(mockDao).insertDate(businessDate); 22 23//~以下略~
A-pZ👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

SpringBootスタータープロジェクトから作成した直後は、src/test/resources がビルドパスに含まれていませんので追加します。

Javaのビルドパスから src/test/resourcesを追加し、その後に以下の2つの操作をします。

  • 出力フォルダーを targer/test-classes に変更
  • テスト・ソースを含む を はい に変更

イメージ説明

投稿2020/09/10 11:40

A-pZ

総合スコア12011

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

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

daphnia99

2020/09/13 03:13

ご回答ありがとうございました。 ご指摘の通りやってみました。今度は違うエラーメッセージが出てしまいました。。。正直検討がつきませんでした。 ``` org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.example.demo.BusinessDateDaoImplTest': Unsatisfied dependency expressed through field 'dao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.demo.repository.BusinessDateDao' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} ``` ちなみにご指摘の操作はEclipse上の設定の話かと思いますが、質問文のエラーはAmazonLinux上でも起こります。 やはり、テスト時のプロパティファイルのパスが`src/main/resources`のままになっているようで、どこかで`src/test/resources`に設定するのだと思うのですが。。。gradleのtestタスクに何か設定する。。。?? もし他に考えられる原因があれば教えていただけますと幸いです。
A-pZ

2020/09/13 10:15

デフォルトのgradle設定であれば、src/test/resourcesの内容でテストが実施されますので、今記載されているgradleタスクのtestで過不足はありませんが、configurationsの記載で「中略」とされているところで何らかの問題があると思われます。(質問内に書かれているのは、mockDao です ) また、↑の内容で記載されたエラー内容は、「dao」 フィールドの依存関係が解決できない内容ですので、質問に記載していただいている テストクラスとは別の問題です。
daphnia99

2020/09/14 06:36

再度のご回答、誠にありがとうございます。gradleは依存関係のところを主に省略しておりました。下記がフルのgradleになります。申し訳ありませんが、皆目見当がつかず。。。 ``` plugins { id 'org.springframework.boot' version '2.2.4.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' id 'war' } war { enabled = true archiveName = 'sample.war' } group = 'com.example' version = '0.0.1-SNAPSHOT' sourceCompatibility = '1.8' configurations { developmentOnly runtimeClasspath { extendsFrom developmentOnly } compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jdbc' //implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.webjars:jquery:3.3.1' implementation 'org.webjars:bootstrap:4.3.1' implementation 'org.webjars:font-awesome:5.13.0' implementation 'org.springframework.boot:spring-boot-starter-aop' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'mysql:mysql-connector-java' annotationProcessor 'org.projectlombok:lombok' testImplementation('org.springframework.boot:spring-boot-starter-test') testImplementation('com.h2database:h2') testCompile 'com.codeborne:selenide:5.11.1' providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' } test { useJUnitPlatform() exclude 'com/example/demo/ViewTest.class' } ```
A-pZ

2020/09/14 09:05

詳細にありがとうございます。あと他の原因を探りたいのですが、Autowiredしている BusinessDateService には、mockBeanでモック化しているBusinessDateDao以外に必要なBeanはないでしょうか?特に dao でインスタンス化が求められているものがありそうです。
daphnia99

2020/09/15 09:16

ご回答引き続きありがとうございます。 実はエラーメッセージが続いていたのを見落としておりました。。。 `SQLException:Access denied for user 'root'@'localhost' (using password: YES)` src/test/resorces/test.propertiesでMySQLのパスワードが間違っておりました。。。 その結果、一番最初のご回答のとおり改めて実施したところ、test.propertiesを読み込むことができました。誠にありがとうございました。
daphnia99

2020/09/15 09:22

このsrc/test/resorcesをビルドパスに加えるという作業は実際なにをやっているのでしょうか? ビルド(テストを経てwarを作成する一連の流れ)で使用するディレクトリとして、/test/resourcesも含めるようEclipseに設定した、という理解で合っていますでしょうか??
A-pZ

2020/09/15 09:28

はい、その通りです。テスト用につかう設定ファイルなどを明示的に設定しています。gradleプロジェクトでしたらデフォルトで用意されますが、Eclipseでプロジェクトを作成した場合にtest/resourcesが用意されないケースがありますので記載しています。
daphnia99

2020/09/15 11:14

ご回答ありがとうございます。理解できました。そして何度も申し訳ありません。 EC2(AmazonLinux2)のJenkinsによるビルドでは引き続きtest.propertiesが見つからない、と言われてしまうのですが、何が原因は考えられますでしょうか。。。
A-pZ

2020/09/15 12:29

Jenkinsビルドした際のテストタスクで、何か別途ビルド設定を変えたりしていますでしょうか。
daphnia99

2020/09/16 07:12

いえ、特段なにもしておりません。そもそもJenkins抜きにして、gitからcloneして./gradlew buildで失敗してしまいます。gradleのバージョンを6.0から6.6にしたりしてみましたがだめでした。。。下記が私のリポジトリです。 https://github.com/fftcysstkm/datemanager 下記参照に、gradleでsrcSetなるものを設定してみたところ色々ディレクトリ構成がごちゃごちゃになってしまいやめました。。。 https://stackoverflow.com/questions/38369060/gradle-custom-test-sourceset
A-pZ

2020/09/16 07:52

確認しますね(少し時間がかかるかもしれません)
daphnia99

2020/09/16 12:03

見ず知らずの自分の問題に貴重なお時間割いて頂いてしまい、大変恐縮です。。。また誠にありがとうございます。。。
A-pZ

2020/09/16 23:01

build.gradleの中を拝見したところ、テスト用にh2databaseをインポートする定義がありますが、test.propertiesで接続しているデータベースはMySQLになっています。こちらは想定どおりでしょうか。
daphnia99

2020/09/17 11:26

ご確認ありがとうございます。 テストもビルドサーバーにインストールしたMySQLに接続するようにしておりました。ですので、dependenciesのh2は余計でした。 しかし、接続するDBはtest.propertiesで決まると認識していましたので、残したままにしておりました。
A-pZ

2020/09/17 12:32

DBの接続情報はあってますかね。
daphnia99

2021/01/19 01:49

お返事が大変遅くなり申し訳ございません。諸事情によりプログラミングから離れておりまして。。。 数々のアドバイス誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問