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

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

ただいまの
回答率

88.91%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,638

Cec

score 19

発生している問題

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • rubytomato

    2019/09/09 15: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の部分だけでもかまいません。

    キャンセル

  • Cec

    2019/09/09 17:42 編集

    コメント有難う御座います。
    パッケージ内の他の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を両方使用できないという事でしょうか。
    もしかすると、ここで競合が起きてしまっているのが原因と考えられますか?

    キャンセル

回答 2

checkベストアンサー

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/10 11:19 編集

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

    キャンセル

  • 2019/09/10 12:40

    先程書きそびれたので追記いたします。
    > 質問文にあるビルド・パスのスクリーンショットですが、JUnit5が含まれている理由、およびMaven依存関係にチェックが付いている理由は何でしょうか?

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

    キャンセル

  • 2019/09/10 13:51

    追記しましたのでご確認ください。

    キャンセル

  • 2019/09/10 15:41

    分かりにくい質問に丁寧にお答えいただき、本当に有難う御座いました。
    自分が曖昧に理解していた点を洗い出すことが出来ました。

    遅くなりましたが、ベストアンサーとさせていただきます。

    キャンセル

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
を追加する事で解決いたしました。
本当に丁寧なご回答を有難う御座いました。
感謝いたしております。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る