2016-08-01 6 views
1

私は外部Webサービスに接続するSpringブートアプリケーションを持っています。プロジェクトはgradleを使って構築されています。私は自分のプログラムで外部呼び出しを嘲笑しています。 STSでjunit testとして実行すると、テストは正常に実行されています。しかし、私が "グラデルビルド"を行うと、テストは失敗しています。ログを調べると、模擬されたオブジェクトを返す代わりに、実際のサービスにテストが掛かっているため、失敗していると思います。テストの一環としてmockitoによって生成されたモックオブジェクトを私のgradleビルドが選択するために必要なことはありますか?Gradldビルド - ユニットテストを実行するためにMockitoによって作成されたモックオブジェクトを使用

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = ProxyApplication.class) 
@WebAppConfiguration 
public class ApplicationWrapperTest { 

    @Mock 
    private SoapClient soapClient; 

    @InjectMocks 
    @Autowired 
    private ApplicationWrapper applicationWrapper; 

    @Before 
    public void init() { 
     MockitoAnnotations.initMocks(this); 
    } 

    @Test 
    public void testDatesInApplication() throws Exception{ 
     //return mock object (webservice response) when soapClient is called 
    } 

ApplicationWrapperコード

@Component 
public class ApplicationWrapper { 

    @Resource(name = "factory.soapClient") 
    private SoapClientFactory soapClientFactory; 

    @Autowired 
    private JsonUtil jsonUtil; 

    @Autowired 
    private DomainUtil domainUtil; 

    private static final String clientId = "soapClient"; 

    public String execute(String request, String apiName){ 
     Object req = domainUtil.createRequest(request, apiName); 
     Object jaxbResponse = this.soapClientFactory.getClient(clientId).marshalSendAndReceive(req); 
     Object response = domainUtil.createResponse(jaxbResponse, apiName); 
     return jsonUtil.toJsonString(response) ; 
    } 


    } 
+0

「ProxyApplication」クラスコードを追加できますか?あなたのモックをオーバーライドする可能性があり、Gradle/Eclipseクラスパスの違いにより、Gradleの場合のみオーバーライドされています。 – Adam

+0

こんにちは@adamr、ProxyApplicationクラスはSpringBoot Mainクラスであり、多数のコンポーネントスキャンが存在します。ビルド中にモックが常に優先順位を取るようにする方法はありますか? –

答えて

3

あなたはProxyApplication.classを通じて差し込ま豆を使用しているので、はい、あなたは、実際のサービスをヒットしています。問題は、MockitoとSpringという2つのテスト手法を混在させることです。

  1. SpringJUnit4ClassRunner.classなしで実行するテストや春の構成:あなたは、いくつかの選択肢があり、これらを回避するために

    @Autowiredを削除します。 MockitoJUnitRunner.classを使用してください。これが本当のユニットテスト

    @RunWith(MockitoJUnitRunner.class) 
    public class ApplicationWrapperTest { 
    
    @Mock 
    private SoapClientFactory soapClientFactory; 
    
    @Mock 
    private SoapClient soapClient; 
    
    @InjectMocks 
    private ApplicationWrapper applicationWrapper; 
    
    @Before 
    public void init() { 
        MockitoAnnotations.initMocks(this); 
    } 
    
    @Test 
    public void testDatesInApplication() throws Exception{ 
        when(soapClientFactory.getClient(eq("yourclientid"))).thenReturn(soapClient); 
        //return mock object (webservice response) when soapClient is called 
    } 
    
  2. soapClientがモックとして設定されているあなたのSpring構成のための春のテスト構成クラスを作成します。

+0

こんにちはjny、私はtestDatesInApplicationメソッドでapplicationWrapper.executeを呼び出していました。このメソッドには、注入したい2つのautowired beanがあります。私はちょうど外部呼び出しを嘲笑したかった。したがって、私は両方のアプローチを使用しました。 SpringJUnit4ClassRunnerを削除した場合、スプリングビーンが注入されていないので、NPEを取得しています。両方のアプローチを組み合わせると、単体テストはIDEでうまく動作しますが、グラブルビルドではうまく動作しません。 –

+0

注入されていないBeanはどれですか? MockitoJUnitRunner.classを使用していますか? – jny

+0

はい、最初はMockitoJunitRunnerを使ってみましたが、この問題を克服しました。私がMockitoJunitRunnerだけを使用すると、Beanは注入されません。そこで私はSpringJunit4ClassRunnerとMockitoの両方を使って実験しました。 –

関連する問題