gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:04:39 24 4
gpt4 key购买 nike

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

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 吗?争论,也是?

最佳答案

丢失您的工厂方法并使用模拟 API,如 EasyMock实现您描述的行为。

然后,您的代码最终会是这样的:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com