如何JMock单身人士

时间:2012-08-12 11:03:17

标签: singleton jmock

我的应用程序有这样的结构:有一个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的错误使用。

谢谢, 安德烈

1 个答案:

答案 0 :(得分:2)

您收到的错误表明您的org.hamcrest包存在类加载问题,而不是您的单例问题。有关此异常的详情,请参阅this question;有关hamcrest和潜在解决方案的特定问题,请参阅this one

检查您的类路径以确保您没有包含来自多个jar的冲突的hamcrest代码。如果您在多个罐子中找到hamcrest,可以通过在类路径中更改其顺序这样简单的事情来纠正。

Junit本身有两个版本 - 一个可能包括旧版本的hamcrest。切换到不包括hamcrest的那个也可以解决你的问题。

如果你能找到一种方法,那么从长远来看,最好完全摆脱单身人士,而是使用像Spring或Guice这样的东西进行依赖注入。

但是一旦你处理了类加载,你所做的就应该工作了,这是在测试环境中处理单例的合理方法。