说我有一个模拟的设置是这样的:如何确定JMock模拟对象嘲笑哪个类?
JUnit4Mockery context = new JUnit4Mockery();
MyInterface mock = context.mock(MyInterface.class);
后来我想检查我的模拟对象,找出它的嘲讽什么课:
Class mockedClass = mock.??? //would return MyInterface.class
我没看到什么明显,JMock的(2.5.1)有关如何做到这一点的javadoc - 为mock
方法签名
<T> T mock (Class<T> typeToMock)
在以前的版本(我看着1.2.0)Y OU将直接创建一个Mock
对象,它的方法之一是
Class getMockedType()
我试图做到的,是使用DI里面我的单元测试的单元测试框架。 (我使用的是Guice 3.0)。在测试中使用DI是对我正在使用的应用程序服务器/平台的限制 - 我测试的对象是具有自己的Injector
的多重子类的子类,这就是我试图填充。
我不希望在每个测试创建AbstractModule的匿名实例,所以我试图建立这样的事情(这似乎将在1.2工作过):
public class MockModule extends AbstractModule {
private Iterable<Mock> mocks;
public MockModule(Iterable<Mock> mocks) {
this.mocks = mocks;
}
protected void configure() {
for (Mock mock : mocks) {
bind(mock.getMockedType()).toInstance(mock);
}
}
}
唯一缺少的是这个问题的答案(如果有的话)。
响应接受的答案
这里是我结束了创建这个用例:
import java.lang.reflect.Proxy;
import com.google.common.collect.Lists;
import com.google.inject.AbstractModule;
@SuppressWarnings({ "rawtypes", "unchecked" })
public class MockModule extends AbstractModule {
private final Iterable mocks;
public MockModule(Object mock) {
mocks = Lists.newArrayList(mock);
}
public MockModule(Iterable mocks) {
this.mocks = mocks;
}
protected void configure() {
for (Object mock : mocks) {
Class superclass = mock.getClass().getSuperclass();
if (superclass != Object.class && superclass != Proxy.class) {
bind(superclass).toInstance(mock);
continue;
}
Class[] interfaces = mock.getClass().getInterfaces();
if (interfaces.length > 0) {
bind(interfaces[0]).toInstance(mock);
}
}
}
}
谢谢!我会拭目以待,看看有人可以提出更强大的版本,但这肯定会让我指出正确的方向。 – arootbeer 2011-12-30 09:17:30
另一种方法可能是创建一个自定义的替代者,为模拟对象添加一个额外的接口来查询他们的类。 – 2011-12-30 09:56:34
我真的很喜欢这个想法......我会研究它。 – arootbeer 2011-12-30 21:09:15