2017-04-05 6 views
1

私はrestTemplateでサービスメソッドを持っています。単体テストの一環として、私はそれを模倣しようとしていますが、いくつかは失敗しています。RestTemplateの単体テストモック

サービス方法:

@Autowired 
private RestTemplate getRestTemplate; 

return getRestTemplate.getForObject(restDiagnosisGetUrl, SfdcCustomerResponseType.class); 

試験方法:

private CaresToSfdcResponseConverter caresToSfdcResponseConverter; 

    @Before 
    public void setUp() throws Exception { 
     caresToSfdcResponseConverter = new CaresToSfdcResponseConverter(); 

    } 
    @Test 
    public void testConvert(){ 
    RestTemplate mock = Mockito.mock(RestTemplate.class); 
     Mockito.when(mock.getForObject(Matchers.anyString(), Matchers.eq(SfdcCustomerResponseType.class))).thenReturn(sfdcCustomerResponseType); 
} 
sfdcRequest = caresToSfdcResponseConverter.convert(responseForSfdcAndHybris); 

それは、NullPointerExceptionが与えています。それは休息テンプレートを模擬するのに失敗しているように見え、残りのテンプレートが空であるのでそこに壊れています。どんな助けもありがたいです。ありがとう

答えて

1

残りのテンプレートを模倣するのは失敗しませんが、模擬した残りのテンプレートを実生活クラスに注入していません。これを修正するには少なくとも2つの方法があります。

生産コードとuse constructor injectionを変更することができます。パラメータとしてコンストラクタにRestTemplateを移動して、あなただけのテストでモックを渡すことができます。

@Service 
public class MyService { 
    @Autowired 
    public MyService(RestTemplate restTemplate) { 
     this.restTemplate = restTemplate; 
    } 
} 

テストであなたは、単に他のオブジェクトとしてサービスを作成し、それをあなたの嘲笑残りのテンプレートを渡します。

それとも、以下のアノテーションを使用してサービスを注入するために、あなたのテストを変更することができます。私は、一般的にコンストラクタ・インジェクションを好むUsing @Mock and @InjectMocks

@RunWith(MockitoJUnitRunner.class) 
public class MyServiceTest { 
    @InjectMocks 
    private MyService myService; 

    @Mock 
    private RestTemplate restTemplate; 

    @Test 
    public void testConvert(){ 
     Mockito.when(mock.getForObject(Matchers.anyString(), Matchers.eq(SfdcCustomerResponseType.class))).thenReturn(sfdcCustomerResponseType); 
    } 
} 

あなたは、別のSO問題の例を参照することができます。

+0

ありがとう@ sm4。これは完全に働いた。私は最初にモックを注入するこの方法を試みましたが、何とかそれは動作していませんでした。 googleでの検索に続いて、他のものに変更されました。再度、感謝します。 – arjun

関連する問題