[英]Using EasyMock to test a method that constructs another object
我有这样的方法:
public void MyMethod(int p1, int p2) {
//some logic here
MyObject mo = new MyObject(var1,var2);
int returnedId = mo.doOperation(something);
//Do something with the returnedId;
}
我想测试这个方法,但我不能模拟构造函数调用,所以围绕它的测试会打破模块化。 我可以使用工厂方法或其他东西,但因为我只有一个构造函数没有意义。
这通常是如何使用EasyMock完成的?
我不确定你是否可以逃离这里的工厂或将对象作为参数传递。 它可能感觉像是一个额外的痛苦世界,但如果你期望模拟对象,你经常需要以特定的样式编码。
我会倾向于工厂方向(当然,定义为界面)。 模拟工厂并在调用getMyObject()
时让它返回模拟对象:
public void myMethod(int p1, int p2, MyObject mo) {
MyObject mo = factory.getMyObject(...args...);
int returnedId = mo.doOperation(something);
}
public interface SomeFactory {
MyObject getMyObject(...args...);
}
或者你可以创建一个接受MyObject
作为参数的方法的重载版本,但它有点难看:
// Test this one, mocking 'mo'
public void myMethod(int p1, int p2, MyObject mo) {
MyObject mo = new MyObject(var1,var2);
int returnedId = mo.doOperation(something);
}
public void myMethod(int p1, int p2) {
myMethod(p1, p2, new MyObject(...));
}
你不能只使用EasyMock。 但是有一些解决方法,比如使用PowerMock作为EasyMock的扩展,这样你就可以模拟静态方法,构造函数调用,最终方法等。
但在此之前,请仔细分析您的问题。 你真的需要在MyMethod
创建MyObject
吗? 通常,以一种所有依赖关系作为构造函数参数或通过setter传递的方式来设计类要好得多。 这种模式通常称为“依赖注入”。 通过执行依赖注入,可以避免像您提到的那样的可测试性问题。
另外,正如Duncan Jones指出的那样, MyMethod
可以将MyObject
作为参数,也可以由工厂获得。 两种解决方案通常比将对象实例化与应用程序逻辑混合更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.