2016-08-03 18 views
0

MockMvcを使用して統合テストケースを作成して、REST APIをテストしています。mockMVCを使用した統合テスト中にnon spring管理オブジェクトをモックする

RESTAPIの実装では、内部的にRestTemplate(コントローラから直接ではなく、コントローラが呼び出すutilクラス内から)を使用してサードパーティのREST APIを呼び出しています。私が使用しているRestTemplate(サードパーティの残りのAPIを作るため)は、スプリングマネージドBeanではなく、代わりに としてインスタンス化しています。RestTemplate restTemplate = new RestTemplate();

私はrestTemplate呼び出し(postForEntity)をモックしたいと思います。

私は、以下のアプローチをしようとしています:

私のテストクラス -

@ContextConfiguration(locations = { 
    "classpath:test-applicationContext.xml" 
}) 
@WebAppConfiguration 

パブリッククラスMockMVCTest私のアプリケーション・コンテキストで{

private MockMvc mockMvc; 
    private RestTemplate restTemplate 

    @Autowired 
    private WebApplicationContext webApplicationContext; 

    @Before 
    public void setUp() { 
    if (!initalized) { 
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
    restTemplate = (RestTemplate)webApplicationContext.getBean("restTemplate"); 

}

@Test 
public void demo() throws Exception { 
when(
    restTemplate.postForEntity(
    eq("thirdpartyuri"), 
    any(HttpEntity.class), 
    eq(MyClass.class))).thenReturn(myresponse); 

mockMvc.perform(
    post("uriExposedbyme") 
    .contentType(MediaType.APPLICATION_JSON) 
    .accept(MediaType.APPLICATION_JSON) 
    .content(MY_PAYLOAD)).andExpect(status().isOk()); 
} 

私は、 llowingモックが定義:

<bean id="restTemplate" class="org.mockito.Mockito" factory-method="mock"> 
    <constructor-arg value="org.springframework.web.client.RestTemplate" />  </bean> 

しかし、私は私のテストケースを実行したときにRestTemplateが嘲笑なっているが、RestTemplateへの呼び出しが実行中に発生したときに実際のresttemplateではなく、私のモックresttemplateで呼ばれています。

私はテストケースのためにRestTemplateを模擬する方法を提案してください。

+0

あなたがテストapplicationContext.xmlを –

+0

こんにちはTharsanを共有することができますが、これは私のテスト、applicationContext.xmlをあります"/> \t \t \t \t <コンストラクタ-argの値= "org.springframework.web.client.RestTemplateセッターを持っている"/> \t \t – Ashwini

答えて

0

あなたが言ったように、utilクラスはプライベートRestTemplateをインスタンス化します:RestTemplate restTemplate = new RestTemplate();.

これは、テストで嘲笑されたものではなく、それを使用することを意味します。 RestTemplateを実際のコードでSpringマネージドBeanにするか、utilクラスにsetterメソッドを持たせ、模擬された残りのテンプレートを使ってこのセッターをテストで呼び出すことができます。

+0

あなたはについて詳しく説明してくださいでした"メソッドをutilクラスに追加し、この設定を擬似休符テンプレートを使用したテストで呼び出す」を参考にしてください。私のユニットテスト – Ashwini

0

提供された情報に基づいて、変更を行い、問題が解決したかどうかを確認することができます。あなたがテストプロファイルむしろ、それが可能な開発プロファイルは、注入されたばかりかもしれない

@Autowired private WebApplicationContext webApplicationContext; 

としてWebApplicationContextをautowire以来 は、私が見ることができることです。あなたは以下のようにあなたのRestTemplateインスタンスと残りのテンプレートを正しく問題、自動ワイヤーを持っている場合 は、したがって、あなたは

@RunWith(SpringJUnit4ClassRunner.class) 

まだテストクラスの最上部にテストプロファイルのクラスをマークするために、この注釈を入れることができます。 <! - コンポーネントスキャン - >:コンポーネント・スキャンベースパッケージ= "mybasepackage \t <コンテキスト

@Autowired 
@Qualifier("restTemplate") 
private RestTemplate restTemplate; 
関連する問題