【发布时间】:2011-10-29 02:21:25
【问题描述】:
我想做的是一种方法,可以
- 生成 X 类的实例(在 arg 中传递的类变量)和
- 覆盖它的一些方法
更具体地说,我要覆盖的父类 X 包含
- 不包含默认构造函数(例如所有带参数的构造函数)
- 在同一个类中调用非私有方法的构造函数
最初我认为使用反射或类似的东西很简单, 然后我发现实现我的要求有限制。
- 对于反射:只能通过 java.lang.reflect.Proxy 覆盖“接口” http://download.oracle.com/javase/1.3/docs/guide/reflection/proxy.html
- 对于cglib:它不能创建没有默认构造函数的实例和调用非私有成员方法的构造函数 http://insufficientinformation.blogspot.com/2007/12/spring-dynamic-proxies-vs-cglib-proxies.html
我认为这是可以实现的,因为 Mockito 可以进行各种方法注入运行时。
请大家给点建议,谢谢。
我图像的伪代码是这样的:
createAndOverride(Class X) {
X newObj = X.newInstance(args) {
@override
methodOfX(args2) {
...
}
}
return newObj;
}
- 原始问题场景
我打算测试一个类,它有几个方法调用 X1.get()、X2.get()、X3.get()
在某些测试用例中,我需要让 Xn.get() 返回一些我可以控制的测试(例如 null)
由于以下限制:
- 但由于模拟工具限制为 JMock 1.0(我无法控制 :( ),所以我不能简单地模拟 Xn.get() 以返回“someSpecifiedObjects”
- Xn 没有 null 构造函数和调用非私有成员的构造函数
我的解决方法是自制 Xn 类,并将它们传递给测试用例,让 Cn.get() 符合预期
代码示例:
ClassToTest.SomeMethod(new X1() {
@override
get() {
return someSpecifiedObjects;
}
});
而且这种东西是分布在测试用例中的。
因此,为了减少重复代码,我想构建一个方法来生成具有指定覆盖方法的 Xn 实例进行测试。例如
X1 x1 = createAndOverride(X1);
那么,这个帖子的问题来了
【问题讨论】:
-
你想将一个方法“注入”到一个类中?
-
是的,但是类类型是在运行时指定的变量
-
我认为你应该告诉我们更多关于最终结果应该是什么,因为这似乎太复杂了。也许有一种更简单的方法可以实现您想要做的事情,而无需在运行时“注入”方法。
-
嗨 Lirik,感谢您帮助我思考我的问题,我已经重新解决了我原来的问题,如果有任何缺失的信息,请阅读并告诉我
-
你知道给定函数应该给出的“值”或“输出”的范围吗?如果没有返回
null的代码路径,那么为什么要测试null?
标签: java reflection overriding cglib