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

时间:2009-08-20 14:12:14

标签: 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参数在函数中执行此操作吗?

2 个答案:

答案 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有两种选择。