簡體   English   中英

EasyMock:模擬出Java中的構造函數調用

[英]EasyMock: Mock out a constructor call in java

我在此板上查看了類似的問題,但沒有一個回答我的問題。 這聽起來很奇怪,但是有可能在您要嘲笑的對象上模擬出構造函數調用。

例:

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)構造函數的主體。

這可能嗎?

您可以使用EasyMock 3.0及更高版本執行此操作。

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

您無法使用easymock做到這一點,因為它不支持模擬構造函數。 據我所知,有一個名為powermock的庫可以做到這一點,據我所知,它是唯一可以對Java中的構造函數和靜態方法進行存根的模擬庫。

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

instance = new UsesNewToInstantiateClass();
expectNew(AnyOldClass.class).andReturn(anyClass);

這就是為什么要注入依賴項(通過Guice或類似軟件包)而不是在類內部創建依賴項的原因。

然后,您不必模擬它們的構造。

這假設(a)這是您可以更改的代碼,並且(b)所討論的對象足夠復雜,因此您應該注入它們。 在類中構造簡單對象很好,但是您不必模擬它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM