java - 在 Java 中,我可以从 Class 对象创建匿名子类的实例吗?

标签 java reflection mocking

我有一个工厂方法,可以创建要在单元测试中使用的对象。这些对象都派生自同一个基类:

public static <T extends BaseEntity> T modMake(Class<T> clazz)
{
    try {
        return clazz.newInstance();
    } catch (InstantiationException e) {
        // Should never happen
        throw new AssertionError(e);
    } catch (IllegalAccessException e) {
        // Should never happen
        throw new AssertionError(e);
    }
}

现在我想重写该基类的 getter 方法,但仅用于测试。我通常会使用匿名类来做到这一点,例如(NodeBaseEntity 的子类型之一):

public static Node nodMake()
{
    return new Node() {
        @Override
        public long ixGet() { return 1; }
    };
}

我也可以使用 Class 参数在函数中执行此操作吗?

最佳答案

失去你的工厂方法并使用像EasyMock这样的模拟API实现您所描述的行为。

你的代码最终将是这样的:

long returnValue = 12;

Node nodeMock = createMock(Node.class);
expect(nodeMock.ixGet()).andReturn(returnValue);
replay(nodeMock);

//add test code here

verify(nodeMock);

回答 Hanno 关于其工作原理的问题:

这取决于您模拟的是接口(interface)还是类。

接口(interface)的情况很简单(代码方面),它使用所谓的动态代理,这是核心 Java 的一部分。

对于来说,它正在执行 @Jonathan 在他的回答中提到的字节码操作,就在一个很好的 API 后面。

以上两种机制都允许拦截方法调用,EasyMock只是根据您设置的期望进行响应。

关于java - 在 Java 中,我可以从 Class 对象创建匿名子类的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1306474/

相关文章:

Python 模拟、django 和请求

java - 具有一些额外条件的子集和算法的复杂性

java - 一个函数中存在多个 execSQL()

引用同一类中的方法时,Java Reflection NoSuchMethodException

Java Reflection API - 获取 String[] 字段的值

java - Mockito Matcher 参数显示为未定义

Java - 在不关闭的情况下中断 I/O

Java:检查非堆内存使用情况

java - 使用字节数组中的类而不进行反射?

javascript - 创建一个什么都不做的 Javascript 对象