2009-08-20 80 views
2

我有创建的对象在单元测试中使用的工厂方法。这些对象都来自同一个基类派生:在Java中,我可以从一个Class对象的匿名子类的实例?

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的subtaypes之一):

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

我可以这样做,在使用Class说法,过于功能?

回答

3

失去你的工厂方法,并使用一个嘲讽的API像EasyMock达到您所描述的行为。

你的代码就结束了这样的事情:

long returnValue = 12; 

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

//add test code here 

verify(nodeMock); 

要回答汉诺的问题上是如何工作的:

这取决于你是否嘲笑的接口或类。

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

对于,它正在执行@Jonathan在他的答案中提到的字节码操作,只是在一个漂亮的API后面。

上述两种机制允许方法调用被拦截和EasyMock只是简单地回应根据您所设定的期望。

+0

有趣。我还没有像这样使用过Java。 – 2009-08-20 15:30:15

+0

我现在实际上在使用EasyMock,它很有趣。谢谢! – 2009-10-09 10:02:33

0

我不认为有什么办法做到这一点。如果你真的需要走这条路线,你可能需要查看字节码操纵器。 Javassist和BCEL是一对选择。

相关问题