繁体   English   中英

使用EasyMock测试构造另一个对象的方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM