2017-04-05 8 views
1

restTemplate이있는 서비스 메소드가 있습니다. 단위 테스트의 일부로, 나는 그것을 조롱하려고 노력하고 있지만 어떤 것은 실패하고 있습니다.RestTemplate에 대한 단위 테스트 모방

서비스 방법 :

@Autowired 
private RestTemplate getRestTemplate; 

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

시험 방법 :

그것은 NullPointerException이주고
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); 

. 그것이 나머지 템플릿을 모의하지 못하는 것 같아요 나머지 템플릿이 null로 거기에 깨고있다. 어떤 도움을 주신다면 감사하겠습니다. 감사합니다. 감사합니다.

답변

1

나머지 템플릿을 모방하지는 않지만 조롱 된 나머지 템플릿을 프로덕션 클래스에 주입하지는 않습니다. 이 문제를 해결하려면 적어도 두 가지 방법이 있습니다.

생산 코드와 use constructor injection을 변경할 수 있습니다. 매개 변수로 생성자에 RestTemplate를 이동 한 다음은 테스트에서 모의를 전달할 수 있습니다 테스트에서

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

을 단순히 다른 객체와 서비스를 생성하고 그것은 당신의 조롱 나머지 템플릿을 전달합니다.

또는 다음과 같은 주석을 사용하여 서비스를 주입 테스트를 변경할 수 있습니다

@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 문제의 예를 볼 수는 : Using @Mock and @InjectMocks

나는 일반적으로 생성자 주입을 선호한다.

+0

감사합니다. @ sm4. 이것은 완벽하게 작동했습니다. 처음에 모의 주입 방법을 시도했지만 어떻게 든 작동하지 않았습니다. 그래서 구글에서 몇 가지 검색을 따라 다른 변경되었습니다. 다시 한번 감사드립니다. – arjun