2017-09-08 14 views
2

これは私のクラスです。ローカルで作成されたオブジェクトをモックするにはどうすればよいですか?

class Test { 
    public void print(){ 
     RestTemplate restTemplate = new RestTemplate(); 
     restTemplate.getForObject("url", String.class); 
    } 
} 

このクラスをテストするには、「RestTemplate」をモックしたいと思います。コードを変更せずにこれを行う方法はありますか?

+1

できません。だからこそ、Springは、その核となる、依存性注入フレームワークです。コンポーネントコンストラクタ(またはセッタ)への引数として、依存関係をモックするために渡します。 –

+0

依存性注入 – John

+0

[Powermock(MockConstructor)](https://github.com/powermock/powermock/wiki/MockConstructor)でこれを行うことができますが、ソースコードを受け入れるように変更することはできません代わりに注入依存関係。 –

答えて

4

は、コードを変更することなく、少なくともエレガントな方法で行うことはできません。

RestTemplateという新しいインスタンスは、print()メソッドを入力するたびに作成されるため、モックを渡す方法はありません。

RestTemplateをパラメータとして使用する方法を少し変更します。実行時にこれはRestTemplateの実際のインスタンスになりますが、メソッドを単体テストするとモックを受け入れることができます。

class Test { 
    public void print(RestTemplate restTemplate){ 
     restTemplate.getForObject("url", String.class); 
    } 
} 

class TestTest { 

    private final Test instance = new Test(); 

    @Test 
    public testPrint() { 
     RestTemplate restTemplateMock = mock(RestTemplate.class); 

     instance.print(restTemplateMock); 

     // TODO: verify method calls on the mock 
    } 
} 
+0

実際には、(https://github.com/powermock/powermock/wiki/MockConstructor)モックコンストラクタをバイトコード操作でモックできますが、それは別の質問です。 –

1

あなたのテストにはRestTemplateの注入されたインスタンスを使用します。テスト・セットアップで

@Autowired 
private TestRestTemplate restTemplate; 

たかったとして、あなたはrestTemplateの動作を模擬することができます。

+1

クラスをテスト可能にするだけの問題でスプリングを投げ込むのはちょっとオーバーヒートです... –

関連する問題