EasyMock:模拟java中的构造函数调用

EasyMock:模拟java中的构造函数调用,java,mocking,easymock,constructor-injection,Java,Mocking,Easymock,Constructor Injection,我在黑板上看过类似的问题,但没有一个能回答我的问题。这听起来很奇怪,但是可以模拟正在模拟的对象的构造函数调用吗 例如: class RealGuy { .... public void someMethod(Customer customer) { Customer customer = new Customer(145); } } class MyUnitTest() { public Customer customerMock = createMock(Cu

我在黑板上看过类似的问题,但没有一个能回答我的问题。这听起来很奇怪,但是可以模拟正在模拟的对象的构造函数调用吗

例如:

class RealGuy {

   ....
   public void someMethod(Customer customer) {
     Customer customer = new Customer(145);
   }
}
class MyUnitTest() {
  public Customer customerMock = createMock(Customer.class)
  public void test1() {
    //i can inject the mock object, but it's still calling the constuctor
    realGuyobj.someMethod(customerMock);
    //the constructor call for constructor makes database connections, and such.
  }
}
我如何期望构造函数调用?我可以将Customer构造函数调用更改为使用newInstance,但我不确定这是否有帮助。我无法控制
新客户(145)
构造函数的主体做什么


这可能吗?

easymock不支持模拟构造函数,因此不能使用它。有一个名为的库可以做到这一点,据我所知,它是唯一一个可以在Java中使用存根构造函数和静态方法的模拟库。

您可以使用EasyMock 3.0及更高版本来实现这一点

import static org.powermock.api.easymock.PowerMock.expectNew;

instance = new UsesNewToInstantiateClass();
expectNew(AnyOldClass.class).andReturn(anyClass);
Customer cust = createMockBuilder(Customer.class)
     .withConstructor(int.class)
     .withArgs(145)
     .addMockedMethod("someMethod")
     .createMock();

这就是为什么要注入依赖项(通过Guice或类似的包),而不是在类中创建它们

那你就不必嘲笑他们的建筑了


这假设(a)这是您可以更改的代码,以及(b)所讨论的对象足够复杂,您应该将其注入。在类中构造简单对象是可以的,但是不需要模拟它们。

最好不要在构造函数中建立数据库连接。使用它们将连接注入类中。已同意。但是我无法控制客户构造函数逻辑。
createMockBuilder
将帮助您在测试代码中创建类的部分模拟。这不会模拟在
someMethod
中调用的构造函数。True。这将只是创建一个模拟对象,而不是模拟构造函数调用。