2016-08-16 9 views
2

私は外部APIコールをモックしようとしていますが、コード構造では私はmockitoが助けになるかどうかわかりません。mockitoを使用して基本クラスのメソッドをモックするか、静的メソッドをモックします

私はSimpleControllerを持っている:

public class SimpleController extends Anothercontroller 
{ 
    @RequestMapping("/classA") 
    { 
    ....... 
    String response = postCall(url, .....); 
    } 
} 

public class AnotherController 
{ 
    public String postCall (String url, ......) 
    { 
    //This is the apache library to make post calls 
    return WebUtil.post(......); 
    } 
} 

は、だから今は、外部サービスへの呼び出しであるPOSTCALLを模擬する必要があります。

ここで私は2ヶ所で模擬することができます

1)POSTCALL()SimpleControllerで、howevere私はそれが組成物の上に継承を好むので、それを行う方法を知りません。

2)WebUtil.post(.....)しかし、私はmockitoがどのように静的メソッドを模倣できるか分かりません。

私はコード構造をリファクタリングしたくありません。他の多くのコードもそれに依存しているからです。

答えて

1

1)POSTCALL()、howevere私はそれが組成物の上に継承を好むので、こと 行う方法を知りません。

これは、スパイを使用してMockitoで可能です。スパイは、特に指定しない限り、実際の方法を使用するオブジェクトのモックです。

// spyController will use real methods expect for postCall() 
SimpleController spyController = Mockito.spy(new SimpleController()); 
Mockito.doReturn("mockedString").when(spyController).postCall(); 

2)WebUtil.post(.....)しかし私はmockitoが 静的メソッドを模擬することができますかわかりません。

これはMockitoでは不可能ですが、2作品-arroundsがあります静的なモックを可能

  1. 使用PowerMock、。
  2. スタティックメソッドを直接呼び出さないようにリファクタリングしてください。これはすでに@mdewitの答えで説明されていますので、ここで詳細を読ませておきます。

個人的には、static dependencies is evilを持っているため、リファクタリングが最もクリーンな解決策だと私は思います。どんな理由であれ、生産コードを変更できない、または変更したくない場合は、Mockito.spy()よりも良いアプローチです。

1

あなたがAnotherControllerを変更するために許可されている場合は、次の操作を行うことができます、そして、

public class WebUtilWrapper { 
    String post(.....) { 
      return WebUtil.post(.....); 
    } 
} 

をとるAnotherControllerにコンストラクタを追加します。まず、あなたがそうのような別のクラスの内部でWebUtilをラップしますWebUtilWrapperをパラメータとして使用します。このコンストラクタはユニットテストで使用されます:

public class AnotherController { 
    private WebUtilWrapper wrapper; 

    public AnotherController() { 
      //default constructor 
      this(new WebUtilWrapper());    
    } 

    public AnotherController(WebUtilWrapper wrapper) { 
      this.wrapper = wrapper; 
    } 

    public String postCall (String url, ......) { 
      //This is the apache library to make post calls 
      return this.wrapper.post(......); 
    } 
} 

最後に、パラメータ化されたコンストラクタをSimpleControllerに追加します。

public class SimpleController extends Anothercontroller { 
     public SimpleController() { 
      super(); 
     } 

     public SimpleController(WebUtilWrapper wrapper) { 
      super(wrapper); 
     } 
     . 
     . 
     . 

ユニットテストでWebUtilWrapper(WebUtilではなく)をモックできます。残りのコードは、デフォルトのコンストラクターが引き続き使用できるように正常に動作します。 SimpleControllerで

関連する問題