假设我有这样的模拟设置:
JUnit4Mockery context = new JUnit4Mockery();
MyInterface mock = context.mock(MyInterface.class);
稍后,我想检查我的模拟对象,找出它在模仿什么类:
Class mockedClass = mock.??? //would return MyInterface.class
在JMock (2.5.1) javadocs中,我没有看到任何关于如何做到这一点的明显信息-- mock
方法的签名是
<T> T mock (Class<T> typeToMock)
在以前的版本中(我看了1.2.0),您将直接创建一个Mock
对象,其方法之一是
Class getMockedType()
我试图实现的是一个在我的单元测试中使用DI的单元测试框架。(我正在使用Guice3.0。)在测试中使用DI是对我正在使用的应用程序服务器/平台的限制--我正在测试的对象是具有自己的Injector
的multiton的子类,这正是我试图填充的。
我不希望在每个测试中都创建一个匿名的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);
}
}
}
}
发布于 2011-12-30 01:12:20
Class mockedClass = mock.getClass().getInterfaces()[0];
System.out.println("Class is " + mockedClass.getCanonicalName());
将印刷:
Interface is MyInterface
可能有更健壮的方法来完成它,但是它至少可以完成这个特定的JMock版本的工作。
发布于 2011-12-30 01:19:41
我不太明白你这么做的动机。JMock通常用于单元测试一个对象,或小的对象集群,这意味着测试中所有的东西都是新的。DI通常是在集成或验收测试的层次,当使用一些看起来更像真实组件的东西时。
您试图在测试中使用DI来显示什么?
https://stackoverflow.com/questions/8677664
复制相似问题