有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何确定JMock模拟对象正在模拟哪个类?

假设我有这样一个模拟设置:

JUnit4Mockery context = new JUnit4Mockery();
MyInterface mock = context.mock(MyInterface.class);

稍后我想检查我的mock对象,找出它在模拟什么类:

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的单元测试框架。(我正在使用Guice 3.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);
            }
        }
    }
}

共 (2) 个答案

  1. # 1 楼答案

    Class mockedClass = mock.getClass().getInterfaces()[0];
    System.out.println("Class is " + mockedClass.getCanonicalName());
    

    将打印:

    Interface is MyInterface
    

    可能有更健壮的方法来实现这一点,但它至少完成了这个特定JMock版本的工作

  2. # 2 楼答案

    我不确定我是否理解你这样做的动机。JMock通常用于对一个对象或一小群对象进行单元测试,这意味着测试中的所有内容都是新的。DI通常在集成或验收测试的层面上起作用,在执行一些看起来更像真实组件的东西时

    通过在测试中使用DI,您试图展示什么