2017-12-31 133 views
0

私はdaoの実装のためのテストケースを持っています。
テストクラスコード -春のブートDaoテスト

@RunWith(SpringRunner.class) 
@RestClientTest({XyzDaoImpl.class}) 
@TestPropertySource(locations = "classpath:application-test.properties") 
public class XyzDaoTest { 

    @Autowired 
    XyzDaoImpl xyzDaoImpl; 

    @Test 
    public void testGetXyzDetails(){ 
     assertThat(xyzDaoImpl.getXyzDetails("123", null)).isNotNull(); 
    } 
} 

xyzDaoImpl.getXyzDetailsメソッドの実装は、RestTemplateを使用してバックエンドを呼び出します。
私のconfigクラスのコードが含まれている場合、このテストは、正常に動作します -

@Bean 
public RestTemplate restTemplate() { 
    return new RestTemplate(); 
} 

が、私は、タイムアウトなどを設定するためにビルダーを使用して、残りのテンプレートを作成した場合、テストが失敗した -

@Profileを使って豆を作成しようとしました
@Bean 
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) { 
    return restTemplateBuilder 
      .setConnectTimeout(timeout) 
      .build(); 
} 

を( "test")defaultと@Profile( "!test") - カスタム設定は、まだテストに失敗します。
エラーがある - @RestClientTestで実行している場合

testException = java.lang.AssertionError: No further requests expected: HTTP POST http://... url. 

答えて

0

RestTemplateBuilderから返さRestTemplateは、実際のクライアントではありません。彼らは偽のサーバー(MockRestServiceServer)に接続されており、期待される要求とそれに対応する応答でセットアップする必要があります。

new RestTemplate()での以前のテストは、ネットワークに接続している実際のクライアントです。

RestTemplateBuilderRestTemplateを生成して、実際のサーバーと通信する場合は、@RestClientTestを離れることができます。

あなたはRestTemplateBuilderMockRestServiceServerに話す嘲笑RestTemplateを生成したい場合は、

  • 使用@RestClientTest
  • セットアップMockRestServiceServer
  • 使用RestTemplateBuilderRestTemplateを生成し、で構成されたリクエストを送信します一つ前の手順。

としては、次のとおりです。@RestClientTestを削除

@RunWith(SpringRunner.class) 
@RestClientTest({XyzDaoImpl.class}) 
@TestPropertySource(locations = "classpath:application-test.properties") 
public class XyzDaoTest { 
    @Autowired 
    private MockRestServiceServer server; 

    @Before 
    public void setUp() throws Exception {    
      this.server.expect(requestTo("/...url")) 
       .andRespond(withSuccess("{\"status\": \"ok\"}", MediaType.APPLICATION_JSON)); 
    } 

    @Test 
    public void testGetXyzDetails(){ 
     assertThat(xyzDaoImpl.getXyzDetails("123", null)).isNotNull(); 
    } 
} 

class XYZDaoImpl { 
    @Autowired 
    RestTemplate client; 
    String getXyzDetails(String a, String b) { 
     return client.getForObject("/...url", String.class); 
    } 
} 
+0

は、このの世話をしました。ありがとう – chappalprasad

+0

上記の@RunClientTestを単体テストのようにしておくと、applicationContextエラーを読み込めません。
私はセットアップ方法で以下を追加しました。
server = MockRestServiceServer.createServer(新しいRestTemplate());
また、XYZDaoImplでAutoriedクラスを含めて試してみました。 EnabledWebMvcを追加した後、Beanを取得しないjava.servlet.ServletContext – chappalprasad

+0

@ ServAppContextは@WebAppConfigurationによって提供されます。 @EnableWebMvcを持つコンポーネントがコンポーネントのスキャンパスにあるため、これを見つけようとしています。 @EnableWebMvcでコンポーネントを除外するか、@ WebAppConfigurationを持つ別のコンポーネントを追加することができます。 – sabertiger

関連する問題