我有一个工厂方法,可以创建要在单元测试中使用的对象。这些对象都来自相同的基类:
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
参数在函数中执行此操作吗?
答案 0 :(得分:3)
丢失工厂方法并使用像EasyMock这样的模拟API来实现您描述的行为。
您的代码最终会是这样的:
long returnValue = 12;
Node nodeMock = createMock(Node.class);
expect(nodeMock.ixGet()).andReturn(returnValue);
replay(nodeMock);
//add test code here
verify(nodeMock);
回答Hanno的问题:
这取决于你是模拟界面还是类。
接口的情况很简单(代码方面),它使用所谓的动态代理,它是核心Java的一部分。
在类的情况下,它正在进行@Jonathan在他的回答中提到的字节码操作,就在一个不错的API后面。
上述两种机制都允许拦截方法调用,而EasyMock只是根据您设置的期望做出响应。
答案 1 :(得分:0)
我认为没有办法做到这一点。如果你真的需要走这条路线,你可能需要研究字节码操纵器。 Javassist和BCEL有两种选择。