【问题标题】:EasyMock: Mock out a constructor call in javaEasyMock:在java中模拟构造函数调用
【发布时间】:2011-10-04 19:50:00
【问题描述】:

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

例子:

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,但我不确定这是否会有所帮助。我无法控制 new Customer(145) 构造函数的主体的作用。

这可能吗?

【问题讨论】:

  • 最好不要在构造函数中建立数据库连接。使用它们将连接注入到类中。
  • 同意。但我无法控制 Customer 构造函数逻辑。

标签: java mocking easymock constructor-injection


【解决方案1】:

您可以使用 EasyMock 3.0 及更高版本来做到这一点。

Customer cust = createMockBuilder(Customer.class)
     .withConstructor(int.class)
     .withArgs(145)
     .addMockedMethod("someMethod")
     .createMock();

【讨论】:

  • createMockBuilder 将帮助您在测试代码中创建类的部分模拟。这不会模拟在 someMethod 中调用的构造函数。
  • 是的。这只会创建一个模拟对象,而不是模拟构造函数调用。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    import static org.powermock.api.easymock.PowerMock.expectNew;
    
    instance = new UsesNewToInstantiateClass();
    expectNew(AnyOldClass.class).andReturn(anyClass);
    

    【讨论】:

      【解决方案4】:

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

      那么你就不必嘲笑他们的构造了。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多