前提・実現したいこと
Javaで作成したwebアプリケーションをビルドしたいが、mavenを使ってビルドしようとした際、
あるJunitを使ったテストで、いくつかのテスト結果がfailureになってしまう。(エラーが出るテストクラスを単体でmavenを使わずに実行すると、結果は全てsuccessになる。)
単体で実行すると全てsuccessになるのに、なぜmavenを使ったビルドの中でテストを行うとfailureになってしまうのかがわからない。
発生している問題・エラーメッセージ
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running model.FileModelTest
Tests run: 11, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.631 sec
Running model.RinriModelTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.003 sec
Running model.SaveModelTest
Tests run: 14, Failures: 6, Errors: 0, Skipped: 0, Time elapsed: 48.116 sec <<< FAILURE!
testMatchWardNumber(model.SaveModelTest) Time elapsed: 0.507 sec <<< FAILURE!
java.lang.AssertionError: expected:<NOT_MATCH_WARD_NUMBER> but was:<NOT_INPUT_BASIC_INFO>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:118)
at org.junit.Assert.assertEquals(Assert.java:144)
at model.SaveModelTest.testMatchWardNumber(SaveModelTest.java:105)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
testSuccessHspXls(model.SaveModelTest) Time elapsed: 0.26 sec <<< FAILURE!
java.lang.AssertionError: expected:<0> but was:<1>
at org.junit.Assert.fail(Assert.java:88)
at org.junit.Assert.failNotEquals(Assert.java:834)
at org.junit.Assert.assertEquals(Assert.java:645)
at org.junit.Assert.assertEquals(Assert.java:631)
at model.SaveModelTest.testSuccessHspXls(SaveModelTest.java:125)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
・・・以下、同様のエラー
該当のソースコード
コメントアウトをしてからビルドするなどして確認した結果、このメソッドを使うとこの事象が起きる事がわかった。
public boolean isCorrectCity(String stateNumber,String municipality) throws IOException{
//都道府県番号から市区町村リストを作成
File f = new File("/resource/市区町村名マスタ.csv");
BufferedReader br = new BufferedReader(new FileReader(f));
String[][] data = new String[47][300];
String line = br.readLine();
for (int row = 0; line != null; row++) {
data[row] = line.split(",", 0);
line = br.readLine();
}
br.close();
//調査票記入内容が市区町村リストに含まれているか判定
for(int row = 0; row < data.length; row++) {
if(data[row][0].trim().contains(stateNumber)){//都道府県番号が合致する行を検索(CSVから取得した値に謎の空白がある場合があるので、containsで判定)
if(Arrays.asList(data[row]).contains(municipality)){//都道府県番号合致行に入力された市区町村名が含まれているか判定
return true;
}else{
return false;
}
}
}
return false;
}
試したこと
- PC再起動
- ~/.m2/repository内ファイルの削除、maven再実行
- ワークスペース再作成、maven再実行
補足情報(FW/ツールのバージョンなど)
- JavaSE-1.8
- Maven3.3.9
- junit4.12
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
以下コードのBufferedReaderを使用している部分の修正をした結果、正常にビルドできるようになりました。
public boolean isCorrectCity(String stateNumber,String municipality) throws IOException{
//都道府県番号から市区町村リストを作成
File f = new File("/resource/市区町村名マスタ.csv");
//BufferedReader br = new BufferedReader(new FileReader(f));
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f),"UTF-8"));
String[][] data = new String[47][300];
String line = br.readLine();
for (int row = 0; line != null; row++) {
data[row] = line.split(",", 0);
line = br.readLine();
}
br.close();
//調査票記入内容が市区町村リストに含まれているか判定
for(int row = 0; row < data.length; row++) {
if(data[row][0].trim().contains(stateNumber)){//都道府県番号が合致する行を検索(CSVから取得した値に謎の空白がある場合があるので、containsで判定)
if(Arrays.asList(data[row]).contains(municipality)){//都道府県番号合致行に入力された市区町村名が含まれているか判定
return true;
}else{
return false;
}
}
}
return false;
}
解決にあたっては以下のサイトの情報を参考にしました。
MavenからJUnitを実行すると文字化けが発生する件の対応方法
恐らくですが、文字コード指定が
- Junit単体実行時、ローカル開発環境でのwebアプリ実行時は、eclipseで指定しているためUTF-8
- Mavenでの実行時はwindowsでのjava実行時の標準文字コードであるMS932
になっており、
CSVファイルを読み込む際の文字コードを明確に指定しないといけなかったのだと思います。
本来であれば、pom.xmlに
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
と指定していれば良いはずで、私も指定していたのですが、何故かうまくいきませんでした。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
質問への追記・修正、ベストアンサー選択の依頼
kochoru
2018/06/08 15:59
mvn test 時のリソース読み込み先が、src/main/resources 以下は読み込まれず、src/test/resources 以下のみ読み込まれるとかあったと思います。そちらは試してみましたか?