0

私はこのような方法を持っています:

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;
}

このメソッドをテストしたいのですが、コンストラクター呼び出しをモックできないため、これをテストするとモジュール性が損なわれます。ファクトリ メソッドなどを使用して実行できますが、コンストラクターが 1 つしかないため、意味がありません。

これは一般的に EasyMock を使用してどのように行われますか?

4

2 に答える 2

1

ここでファクトリをエスケープしたり、オブジェクトを引数として渡したりできるかどうかはわかりません。余分な苦痛の世界のように感じるかもしれませんが、オブジェクトをモックすることを期待している場合、特定のスタイルでコーディングする必要があることがよくあります。

私はファクトリの方向に傾きます (もちろん、インターフェイスとして定義されています)。ファクトリをモックし、呼び出し時にモックされたオブジェクトを返すようにします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...);    
}

または、引数として a を受け入れるメソッドのオーバーロードされたバージョンを作成することもできますが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(...));
}
于 2012-08-30T20:09:43.560 に答える
1

EasyMock だけではできません。ただし、PowerMock をEasyMockの拡張機能として使用するなどの回避策があり、静的メソッド、コンストラクター呼び出し、最終メソッドなどをモックできます。

ただし、それを行う前に、問題を注意深く分析してください。本当にMyObject内部で作成する必要がありますMyMethodか? 一般に、すべての依存関係がコンストラクターの引数として、またはセッターを介して渡されるようにクラスを設計する方がはるかに優れています。これは、一般に「依存性注入」と呼ばれるパターンです。依存性注入を行うことで、あなたが言及したようなテスト容易性の問題を回避できます。

また、Duncan Jones が指摘するように、パラメーターとして受け取ることも、ファクトリによって取得することもできますMyMethodMyObject通常、どちらのソリューションも、オブジェクトのインスタンス化とアプリケーション ロジックを混在させるよりも優れています。

于 2012-08-30T20:18:20.020 に答える