web-dev-qa-db-ja.com

ハムクレストテストは常に失敗する

私はhamcrest 1.3を使用してコードをテストしています。ただのサイコロです。生成された数値が13未満であることを確認するためにテストしようとしています。生成された数値が何であるかを印刷する印刷ステートメントがありました。生成された数は常に13未満でしたが、テストは常に失敗しました。私が間違っていることはありますか?

これは私がテストしているコードです。

import Java.util.Random;

public class Die {
    private int numSides;
    Random Rand;

    public Die(int numSides){
        this.numSides = numSides;
        Rand = new Random(System.currentTimeMillis());
    }

    public int roll(){
        return Rand.nextInt(numSides) + 1;
    }
}

これが私のテストコードです。

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

import org.junit.Test;

public class DieTest {
    @Test
    public void testRoll() {
        Die x = new Die(12);    
        assertThat(x.roll(), is(lessThan(13)));
    }
}

編集:これは障害スタックトレースです。

Java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package
at Java.lang.ClassLoader.checkCerts(Unknown Source)
at Java.lang.ClassLoader.preDefineClass(Unknown Source)
at Java.lang.ClassLoader.defineClassCond(Unknown Source)
at Java.lang.ClassLoader.defineClass(Unknown Source)
at Java.security.SecureClassLoader.defineClass(Unknown Source)
at Java.net.URLClassLoader.defineClass(Unknown Source)
at Java.net.URLClassLoader.access$000(Unknown Source)
at Java.net.URLClassLoader$1.run(Unknown Source)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(Unknown Source)
at Java.lang.ClassLoader.loadClass(Unknown Source)
at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at Java.lang.ClassLoader.loadClass(Unknown Source)
at DieTest.testRoll(DieTest.Java:12)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at Java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.Java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.Java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.Java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.Java:20)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:76)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.Java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.Java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.Java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.Java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.Java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.Java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.Java:236)
at org.Eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.Java:49)
at org.Eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.Java:38)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:467)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)
at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.Java:197)
43
beachw08

これは、問題の解決に役立つサイトです。

http://code.google.com/p/hamcrest/issues/detail?id=128

Hamcrest.jarは、ビルドパスでJunitライブラリの前に配置する必要があります。

73
beachw08

プロジェクト構成からJUnitライブラリーを削除しました。 JUnitもpomファイルに含まれているため、テストを実行できます。したがって、ソリューションはMavenのライブラリを使用するだけです。

15
Hunsu

Java Build Pathセクション、ライブラリ内のEclipse私の場合。

この情報をここに残します。おそらく、他の誰かが私の経験から利益を得るでしょう。

12
RockyMM

Junit.jarではなくjunit-dep.jarを使用します。これは、JUnitからその依存関係を引いたものです。 Junit.jarには、古いバージョンのHamcrestが含まれています。

6
Kkkev

ヨハンマーク(上記)に提案

ファイルの名前を変更する$Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jarのようなもの*.bakまたはファイルを削除します。」

ファイルの名前を変更/削除すると、Eclipse Junitライブラリが機能しなくなりましたが、JARファイルをMavenリポジトリの同じバージョンのコピーに置き換えると、証明書の問題はなくなりました。

(Googleの誰かが言ったように、hamcrestのEclipse Junitコピーには証明書の問題がありますが、Mavenコピーにはありません...)

5
Janneman

Mavenプロジェクトを使用している場合は、ビルドパスからJunitライブラリを削除し、代わりにPOMを介してJunitとHamcrestを個別にインポートします。

5
Avinav K

まず、POM.xmlファイルにJUnit依存関係を追加したことを確認してください。

ここで、プロジェクトを右クリックしてプロパティに移動し、Javaビルドパスを選択して、[ライブラリ]タブを選択します。

私の場合、Maven依存関係、JREおよびJunit4ライブラリがありました。そして、私はちょうどJunitライブラリを削除しました。または、HamcrestとJUnit4のビルド順序が原因で問題が発生したため、ライブラリを並べ替えることもできます。

4
imbond

同じ例外が発生していました。推奨されるbeachw08のように、私は言及しました:

http://code.google.com/p/hamcrest/issues/detail?id=128

投稿の1つは言った:

ファイル$ Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jarの名前を* .bakのような名前に変更するか、ファイルを削除します。

私はこれをして、それが私の問題を解決しました。

3
John Mark

「Java.lang.SecurityException:クラス "org.hamcrest.Matchers"の署名者情報が同じパッケージ内の他のクラスの署名者情報と一致しない」という例外が発生した場合、hamcrest jarがJunitライブラリの前にあることを確認してください。ビルドパス。プロジェクトプロパティでJava Order and ExportタブのBuild Pathで設定できます。より明確にするために画像リンクをクリックしてください。 http://i.stack.imgur .com/Y5R15.png

2
Vaibhav Gupta

ビルドパスからJunit4ライブラリを削除してこの問題を解決し、ビルドパスにTestNGライブラリを追加し、my JavaプログラムでJunit4アノテーションの代わりにTestNGアノテーションをインポートしました。

1
Jlearner

これは私の問題を解決しました:

$ Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jarをMavenまたはプロジェクトのlibのhamcrest-core-xx.jarに置き換えます(明らかにEclipse jarと同じ名前に変更します)

0
Chetan Gole

私は次のことをしました:

最初にpomファイルで、junit依存関係からhamcrest-coreを除外し、代わりにhamcrest-allを使用しました。次に、Mavenをオーバーライドするため、ビルドパスからEclipse JUNITを削除しました。悪い瓶が除外されたため、注文は私の瓶に影響しませんでした。

0
user666

特定のコンテキストでこの問題を解決しようとする場合、上記のスタックトレースは単なる症状にすぎないことに注意してください。このソリューションは一部の人には有効かもしれませんが、他の人には有効ではありません。

例えば:

  • クラスパスでJUnit JARの前にHamcrest JARを置くと、使用中のJUnitのバージョン(古い)にHamcrestクラスが含まれる場合に機能します。
  • 他のEclipseプラグインバンドルが元の内部JARのマニフェスト情報を使用していない場合、Eclipseで内部的に使用されるHamcrestのバージョンを、内部バージョンに一致するように名前が変更された「ストック」バージョンでオーバーレイすることができます

私の場合、上記の症状は、内部で使用され、Eclipseによって提供されるHamcrest JARが原因でした。それを「stock」に名前を変更したバージョンに置き換えようとしても、Eclipseを起動したときにJUnitに関連するものを読み込めませんでした。元の内部バージョンに戻した後、SecurityExceptionが返されました。私のために働いた解決策は、7-Zipを使用してJARのマニフェストを削除することでした。これにより、JARが事実上「署名されていない」状態になり、特定の構成が機能するようになりました。

0
user6629913

最近、EclipseとJunitでこの問題が発生しました。

これを解決するために、私はそれをしました:

1-最新のhamcrest-all jarをここからダウンロードします。 https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/hamcrest/

2- EclipseのインストールフォルダーであるEclipse/plugin /に移動し、org.hamcrest ... jarを見つけます。

3-ステップ2のjarのバックアップを作成し、ステップ1のjarに置き換えます(jarのステップ2と同じ名前に変更します)。

4- Eclipseを再起動する

その後、私の問題は解決しました。

0
Ravi NAGALINGAM

私の環境Mac OS + Eclipseで、org.hamcrest.core_1.3.0.v201303031735.jarがJUnit 4にあることがわかったので、junit.jarより先に進めません。

したがって、パス〜/ .p2/pool/plugins /からそれを削除してから、プロジェクトを更新すると動作します。

0
jet.lau

プロジェクトのビルドプロパティに移動し、JUNITをバージョン4からバージョン3に変更しましたが、現在は正常に機能しています。

おもしろいことに、pom.xmlにはまだバージョン4があるので、これはEclipseの問題であると思う傾向があります(ターミナルでテストをビルドして実行できました)。

0
jbunton10

Eclipseの[ライブラリ]タブからJUNIT 4ライブラリを削除しました-> Java Build path and work。

0
Yogesh Samant

私はまったく同じ問題を抱えていました。新しいプロジェクトを作成し、問題を解決しました。

0
PTT

ここで詳述したのと同じ問題がありました。問題はjunit4 jarファイルにあると思います。

Eclipse pomエディターでjunit4 Hierarchyを見ると、hamcrest-coreに依存していることがわかります(つまり、デフォルトでhamcrest-coreはコンパイル時に取り込まれます)。ユニットテストコードでは、hamcrestコレクションマッチャー(org.hamcrest.collection)を使用します。これらはコアjarには含まれておらず、pomのhamcrest-allへの依存関係を設定します。これを行うと、hamcrest-coreのインクルージョンが複製され、junit hamcrest-core依存関係とのセキュリティ例外とのバージョンミスマッチが発生する可能性があります。 hamcrest-all依存関係を削除し、hamcrest-libraryに置き換えたところ、例外はなくなりました。

コアhamcrestのみを使用する場合は、独自の依存関係を設定して、junitプルインのバージョンに依存しないでください。別のコメントで示唆されているように、junit-depを使用してjunit依存関係を取り除き、hamcrest-allを含めます。

0
Richard B

Mavenを使用している場合:

手順:

  1. ここから最新のHamcrest依存関係をPOMに追加します https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all

  2. ここから最新のJUnit依存関係をPOMに追加します https://mvnrepository.com/artifact/junit/junit

  3. ビルドパスからJUnitライブラリを削除します。

ここに示すように

およびここ

  1. 上記のすべての手順を完了したら、プロジェクトを更新して実行します。
0
PRITEN PATEL