0

私のアプリケーションにはこの構造があります。Singleton (UserRepository など) である他の多くの ObjectRepository を使用する RepositoryFacade (Singleton) があります。

[Objetct]Repositiries をモックしてテストしたいと思います。そのために、[Objetct]Repositiry にインターフェイスを実装してから、次のことを試みました。

final IUserRepository mockIUserRepository= context.mock(IUserRepository.class);
RepositoryFacade.getInstance().setUserRepository(mockIUserRepository);
final User testUser = new User("username");

// expectations
context.checking(new Expectations() {{
    oneOf (mockIUserRepository).save(testUser);
}});
// execute
RepositoryFacade.getInstance().save(testUser);

そして、RepositoryFacade に次を追加しました。

public IUserRepository userRepository = UserRepository.getInstance();

しかし、テストを実行しようとすると、次のようになります。

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

ps もともと、私の RepositoryFacade には IUserRepository 変数がありませんでした。常に UserRepository.getInstance().what_i_want() を要求して使用していました。JMock を使用するために導入したので、必要がなければ、Singleton の悪い使用法を削除します。

ありがとう、アンドレア

4

1 に答える 1

2

表示されるエラーは、シングルトンの問題ではなく、org.hamcrest パッケージにクラスローディングの問題があることを示唆しています。この例外の詳細については、この質問を参照してください。ハムクレストと潜在的な解決策に関する特定の問題については、この質問を参照してください。

クラスパスをチェックして、複数の jar から競合する hamcrest コードが含まれていないことを確認してください。複数の jar に hamcrest が見つかった場合は、クラスパス内の順序を変更するだけで修正できます。

Junit 自体には 2 つのバージョンがあり、一方には古いバージョンの hamcrest が含まれている場合があります。ハムクレストを含まないものに切り替えると、問題が解決する場合もあります。

それを行う方法を見つけることができれば、長期的にはシングルトンを完全に取り除き、代わりに Spring や Guice などを使用して依存性注入を行う方がよいでしょう。

しかし、クラスローディングに対処すれば、あなたがしていることはうまくいくはずです。これは、テストコンテキストでシングルトンを処理するための合理的なアプローチです。

于 2012-08-12T11:43:02.267 に答える