我的应用程序有这样的结构:有一个RepositoryFacade(也就是一个Singleton),它使用了许多其他的ObjectRepository,它们是Singleton(UserRepository等)。
现在我想测试它,嘲笑[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
P.S。最初我的RepositoryFacade没有IUserRepository变量,我用它总是询问UserRepository.getInstance()。what_i_want()。我介绍它试图使用JMock,所以如果不需要我会很高兴删除对Singleton的错误使用。
谢谢, 安德烈
答案 0 :(得分:2)
您收到的错误表明您的org.hamcrest包存在类加载问题,而不是您的单例问题。有关此异常的详情,请参阅this question;有关hamcrest和潜在解决方案的特定问题,请参阅this one。
检查您的类路径以确保您没有包含来自多个jar的冲突的hamcrest代码。如果您在多个罐子中找到hamcrest,可以通过在类路径中更改其顺序这样简单的事情来纠正。
Junit本身有两个版本 - 一个可能包括旧版本的hamcrest。切换到不包括hamcrest的那个也可以解决你的问题。
如果你能找到一种方法,那么从长远来看,最好完全摆脱单身人士,而是使用像Spring或Guice这样的东西进行依赖注入。
但是一旦你处理了类加载,你所做的就应该工作了,这是在测试环境中处理单例的合理方法。