🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JUnit

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Apache Maven

Apache Mavenは、ソフトウェアプロジェクトの管理ツールです。

Q&A

解決済

2回答

4995閲覧

Eclipse + JUnit5 で Hamcrest Machers を使用したテストを実行すると、SecurityExceptionが発生する。

退会済みユーザー

退会済みユーザー

総合スコア0

JUnit

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Apache Maven

Apache Mavenは、ソフトウェアプロジェクトの管理ツールです。

0グッド

0クリップ

投稿2019/09/09 04:33

編集2019/09/09 08:30

発生している問題

Eclipse + JUnit5 で Hamcrest Machers を使用したテストを実行すると、

java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package

になります。

解決策として、「hamcrest-libraryをpom.xmlに追加し2、Maven依存関係の順序をJUnitライブラリーより上にする。」という情報が多かったので試しましたが、解決しませんでした。

他に原因をご存知の方がいらっしゃいましたらお教え願えますでしょうか。
宜しくお願い致します。

該当のソースコード

pom.xml

<url>http://maven.apache.org</url> <properties> <maven.compiler.target>11</maven.compiler.target> <java.version>11</java.version> <maven.compiler.source>11</maven.compiler.source> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-library</artifactId> <version>2.2-rc1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>5.5.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.5.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-migrationsupport</artifactId> <version>5.5.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-launcher</artifactId> <version>1.5.1</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13-beta-3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.0.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.12.2</version> <scope>test</scope> </dependency>

test class

package test.model.beans; import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*; import org.junit.jupiter.api.Test; import model.beans.Account; public class AccountTest { @Test public void test() { String userId="Shima5"; String pass="135790"; String name="島紀香"; int age=34; Account expected=new Account(userId,pass,name,age); Account ac=new Account(userId,pass,name,age); assertThat(ac,samePropertyValuesAs(expected)); } }

エラーメッセージ

java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package at java.base/java.lang.ClassLoader.checkCerts(ClassLoader.java:1150) at java.base/java.lang.ClassLoader.preDefineClass(ClassLoader.java:905) at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1014) at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174) at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:802) at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:700) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:623) at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521) at test.model.logic.RegisterLogicTest.test1(RegisterLogicTest.java:91) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:628) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:117) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:184) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:180) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:127) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229) at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197) at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:137) at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:89) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:41) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:541) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:763) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:463) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:209)

試したこと

その他参考にさせていただいたサイト
よりEclipseのプロパティでも順番を変えてみましたが変わりませんでした。
イメージ説明

補足情報

Eclipse2019-03 (4.11.0)
Maven 3.8

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

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

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

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

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

rubytomato

2019/09/09 06:53

何点か疑問がありますので確認させてください。 1) JUnit4 と JUnit 5を併用されていますが、既存のテストコードがJUnit 4で書かれていて、これからJUnit 5へ移行するという状況なのでしょうか? 2) JUnit 4.13-beta-3とベータ版を利用する理由はなんでしょうか? これからJUnit5へ移行するのであればベータ版をあえて利用するのはどのような意図があるのでしょうか? 3) アサーションにHamcrestとAssertJ Coreの両方を利用する理由はなんでしょうか? JUnit4ではHamcrest、JUnit5ではAssertJ Coreという使い分けなどでしょうか? 4) 質問文に掲載されているテストクラスコードについて、差し支えなければimport文から掲載をお願いいたします。全文がむりであればMatchersの部分だけでもかまいません。
退会済みユーザー

退会済みユーザー

2019/09/09 08:45 編集

コメント有難う御座います。 パッケージ内の他のLogicやServletに対するテストコードを調べ、エラーが出たら依存関係に追加して、また調べて...という感じで書いている状態の者でして、 ご質問に的確にはお答えできませんが...以下のような理由になります。 1) 同じパッケージ内の別のLogicのテストで、JUnit4の機能を使用している部分があるからで、「junit-vintage-engineを使えばJUnit 5でJUnit 3・JUnit 4テストを実行できる」と分かったので、当初「junit-vintage-engine」のみを依存関係に追加していたのですが、何か別のエラー(「JUnit [4 or 3?]がありません」、のような表示が出たために追加したと記憶してます。)を解決する際に追加しました。 2) 申し訳ありません、初学者のため違いがよくわかりません。 3) >JUnit4ではHamcrest、JUnit5ではAssertJ Coreという使い分けなどでしょうか? そういう事になるのでしょうか...。 Eclipseの表示に従ってimportしました。 4) コード追加致しました。 基本的に、4, 5を両方使用できないという事でしょうか。 もしかすると、ここで競合が起きてしまっているのが原因と考えられますか?
guest

回答2

0

追記  ※文字数制限の都合でこちらに記載させていただきます。

実際には下記のコードなので、JUnit4:AssertとHamcrestを一緒に使っていないと思います。

質問記載時

org.hamcrest.MatcherAssert.assertThat(ac,samePropertyValuesAs(expected))

で例外発生 ==>  Eclipse選択肢より

org.junit.Assert.assertThat(ac,samePropertyValuesAs(expected))

に変更していた為、分かりにくいコメントをしてしまいました。申し訳ありません。
変更した時点でも、同じ例外が発生していたのですが、
rubytomato様のおっしゃるように
Eclipse ビルドパスの構成から'Maven 依存関係'を除去して、
**pom.xmlの<dependency>**にjunit-platform-launcherjunit-jupiter-params
を追加する事で解決いたしました。
本当に丁寧なご回答を有難う御座いました。
感謝いたしております。

投稿2019/09/10 06:32

編集2019/09/10 06:43
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

質問文の追記ありがとうございます。
JUnit4を使ったテストコードがある環境で、あたらしくJUnit5を使ったテストコードを書きたいということだと理解しました。
下記のpom.xmlの内容でJUnit4/5のテストコードが書けると思いますのでご確認ください。

<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>11</java.version> <maven.compiler.source>${java.version}</maven.compiler.source> <maven.compiler.target>${java.version}</maven.compiler.target> </properties> <dependencies> <!-- JUnit5 --> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.5.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-launcher</artifactId> <version>1.5.1</version> <scope>test</scope> </dependency> <!-- for JUnit4 --> <dependency> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> <version>5.5.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-migrationsupport</artifactId> <version>5.5.1</version> <scope>test</scope> </dependency> <!-- assertion --> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.12.2</version> <scope>test</scope> </dependency> <!-- mock --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>3.0.0</version> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <release>${java.version}</release> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.0.0-M3</version> </plugin> </plugins> </build>

それから質問文にあるビルド・パスのスクリーンショットですが、JUnit5が含まれている理由、およびMaven依存関係にチェックが付いている理由は何でしょうか?
特に理由がなければ、下の図の状態で問題ないと思います。

ソース
イメージ説明
プロジェクト
イメージ説明
ライブラリ
イメージ説明
順序およびエクスポート
イメージ説明

2019/09/10追記

直接の原因は

assertThat(ac,samePropertyValuesAs(expected));
で発生していました。JUnit4:AssertとHamcrestを一緒に使うとダメみたいです。

『一緒に使うとダメ」とはどのような意味か教えてください。原因とされる下記コードは

assertThat(ac,samePropertyValuesAs(expected));

実際には下記のコードなので、JUnit4:AssertとHamcrestを一緒に使っていないと思います。

org.hamcrest.MatcherAssert.assertThat(ac, org.hamcrest.Matchers.samePropertyValuesAs(expected));

これは質問文に記載して頂いたimport文から判断しています。

import static org.hamcrest.MatcherAssert.*; import static org.hamcrest.Matchers.*;

別のテストケースで、

@RunWith(JUnitPlatform.class)
@SelectClasses(ErrorCheckLogicTest.class)
を使っているクラスがあり、Eclipseで依存関係に入れるように
選択肢が表示されました。これを外すと警告が出ます。

依存関係に下記junit-platform-runnerを追加してみてください。

<dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-runner</artifactId> <version>1.5.1</version> <scope>test</scope> </dependency>

最後に1つ確認させて頂きたいのですが、質問文のAccountTestクラスは、部分的に省略して記載されているのでしょうか?

投稿2019/09/09 13:16

編集2019/09/10 04:51
rubytomato

総合スコア1752

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

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

退会済みユーザー

退会済みユーザー

2019/09/10 02:20 編集

大変丁寧にご説明いただき有難う御座います。 お陰様で脳内を整理することができました。当初、理解しきれていない部分が多すぎて、例外の原因が曖昧なまま質問文を投稿してしまいましたが、 直接の原因は assertThat(ac,samePropertyValuesAs(expected)); で発生していました。JUnit4:AssertとHamcrestを一緒に使うとダメみたいです。もし何かお分かりになりましたら、ご教示いただけると幸いです。
退会済みユーザー

退会済みユーザー

2019/09/10 03:40

先程書きそびれたので追記いたします。 > 質問文にあるビルド・パスのスクリーンショットですが、JUnit5が含まれている理由、およびMaven依存関係にチェックが付いている理由は何でしょうか? 別のテストケースで、 @RunWith(JUnitPlatform.class) @SelectClasses(ErrorCheckLogicTest.class) を使っているクラスがあり、Eclipseで依存関係に入れるように 選択肢が表示されました。これを外すと警告が出ます。
rubytomato

2019/09/10 04:51

追記しましたのでご確認ください。
退会済みユーザー

退会済みユーザー

2019/09/10 06:41

分かりにくい質問に丁寧にお答えいただき、本当に有難う御座いました。 自分が曖昧に理解していた点を洗い出すことが出来ました。 遅くなりましたが、ベストアンサーとさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問