私は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)
これは、問題の解決に役立つサイトです。
http://code.google.com/p/hamcrest/issues/detail?id=128
Hamcrest.jarは、ビルドパスでJunitライブラリの前に配置する必要があります。
プロジェクト構成からJUnitライブラリーを削除しました。 JUnitもpomファイルに含まれているため、テストを実行できます。したがって、ソリューションはMavenのライブラリを使用するだけです。
Java Build Pathセクション、ライブラリ内のEclipse私の場合。
この情報をここに残します。おそらく、他の誰かが私の経験から利益を得るでしょう。
Junit.jarではなくjunit-dep.jarを使用します。これは、JUnitからその依存関係を引いたものです。 Junit.jarには、古いバージョンのHamcrestが含まれています。
ヨハンマーク(上記)に提案
ファイルの名前を変更する
$Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jar
のようなもの*.bak
またはファイルを削除します。」
ファイルの名前を変更/削除すると、Eclipse Junitライブラリが機能しなくなりましたが、JARファイルをMavenリポジトリの同じバージョンのコピーに置き換えると、証明書の問題はなくなりました。
(Googleの誰かが言ったように、hamcrestのEclipse Junitコピーには証明書の問題がありますが、Mavenコピーにはありません...)
Mavenプロジェクトを使用している場合は、ビルドパスからJunitライブラリを削除し、代わりにPOMを介してJunitとHamcrestを個別にインポートします。
まず、POM.xmlファイルにJUnit依存関係を追加したことを確認してください。
ここで、プロジェクトを右クリックしてプロパティに移動し、Javaビルドパスを選択して、[ライブラリ]タブを選択します。
私の場合、Maven依存関係、JREおよびJunit4ライブラリがありました。そして、私はちょうどJunitライブラリを削除しました。または、HamcrestとJUnit4のビルド順序が原因で問題が発生したため、ライブラリを並べ替えることもできます。
同じ例外が発生していました。推奨されるbeachw08のように、私は言及しました:
http://code.google.com/p/hamcrest/issues/detail?id=128
投稿の1つは言った:
ファイル$ Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jarの名前を* .bakのような名前に変更するか、ファイルを削除します。
私はこれをして、それが私の問題を解決しました。
「Java.lang.SecurityException:クラス "org.hamcrest.Matchers"の署名者情報が同じパッケージ内の他のクラスの署名者情報と一致しない」という例外が発生した場合、hamcrest jarがJunitライブラリの前にあることを確認してください。ビルドパス。プロジェクトプロパティでJava Order and ExportタブのBuild Pathで設定できます。より明確にするために画像リンクをクリックしてください。 http://i.stack.imgur .com/Y5R15.png
ビルドパスからJunit4ライブラリを削除してこの問題を解決し、ビルドパスにTestNGライブラリを追加し、my JavaプログラムでJunit4アノテーションの代わりにTestNGアノテーションをインポートしました。
これは私の問題を解決しました:
$ Eclipse_HOME\plugins\org.hamcrest.core_1.3.0.v201303031735.jarをMavenまたはプロジェクトのlibのhamcrest-core-xx.jarに置き換えます(明らかにEclipse jarと同じ名前に変更します)
私は次のことをしました:
最初にpomファイルで、junit依存関係からhamcrest-coreを除外し、代わりにhamcrest-allを使用しました。次に、Mavenをオーバーライドするため、ビルドパスからEclipse JUNITを削除しました。悪い瓶が除外されたため、注文は私の瓶に影響しませんでした。
特定のコンテキストでこの問題を解決しようとする場合、上記のスタックトレースは単なる症状にすぎないことに注意してください。このソリューションは一部の人には有効かもしれませんが、他の人には有効ではありません。
例えば:
私の場合、上記の症状は、内部で使用され、Eclipseによって提供されるHamcrest JARが原因でした。それを「stock」に名前を変更したバージョンに置き換えようとしても、Eclipseを起動したときにJUnitに関連するものを読み込めませんでした。元の内部バージョンに戻した後、SecurityException
が返されました。私のために働いた解決策は、7-Zipを使用してJARのマニフェストを削除することでした。これにより、JARが事実上「署名されていない」状態になり、特定の構成が機能するようになりました。
最近、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を再起動する
その後、私の問題は解決しました。
私の環境Mac OS + Eclipseで、org.hamcrest.core_1.3.0.v201303031735.jarがJUnit 4にあることがわかったので、junit.jarより先に進めません。
したがって、パス〜/ .p2/pool/plugins /からそれを削除してから、プロジェクトを更新すると動作します。
プロジェクトのビルドプロパティに移動し、JUNITをバージョン4からバージョン3に変更しましたが、現在は正常に機能しています。
おもしろいことに、pom.xmlにはまだバージョン4があるので、これはEclipseの問題であると思う傾向があります(ターミナルでテストをビルドして実行できました)。
Eclipseの[ライブラリ]タブからJUNIT 4ライブラリを削除しました-> Java Build path and work。
私はまったく同じ問題を抱えていました。新しいプロジェクトを作成し、問題を解決しました。
ここで詳述したのと同じ問題がありました。問題は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を含めます。
Mavenを使用している場合:
手順:
ここから最新のHamcrest依存関係をPOMに追加します https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all
ここから最新のJUnit依存関係をPOMに追加します https://mvnrepository.com/artifact/junit/junit
ビルドパスからJUnitライブラリを削除します。