我有一个工厂方法,可以创建要在单元测试中使用的对象。这些对象都派生自同一个基类:
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 方法,但仅用于测试。我通常会使用匿名类来做到这一点,例如(Node
是 BaseEntity
的子类型之一):
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/