[SPRING] MockRestServiceServer로 RestTemplate을 조롱하는 법?
SPRINGMockRestServiceServer로 RestTemplate을 조롱하는 법?
@RunWith(MockitoJUnitRunner.class)
public class FeatureFlipperManagerTest {
@Autowired
RestTemplate restTemplate = new RestTemplate();
@Autowired
Service service = new Service();
MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate);
@Test
public void test() throws Exception {
mockServer.expect(requestTo(Mockito.anyString()))
.andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON));
boolean res = service.isEnabled("xxx");
mockServer.verify();
Assert.assertEquals(true, res);
}
}
나는 서비스에서 mockRestServiceServer를 모방 restTemplete 있습니다. 하지만 항상 실패합니다. 그것은 java.lang.AssertionError로 오류를 보여줍니다 : 추가 요청은 예상 됨 1 개 중 0 개가 실행되었습니다. 어느 누구도 내가 제대로하지 못하는 곳을 알려줄 수있었습니다.
서비스 자체는 다음과 같습니다.
public class Service{
public boolean isEnabled(String xxx) {
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class);
if(...)return true;
return false;
}
}
해결법
-
==============================
1.우선, Service 클래스는 모든 요청에 대해 RestTemplate의 새 인스턴스를 만듭니다. 나는 그것이 얼마나 나쁜 연습인지 충분히 강조 할 수 없다. RestTemplate 타입의 bean을 생성하여 Service bean에 삽입하십시오 (사용중인 Spring MVC 버전에 따라 이미 생성되었을 가능성이 큽니다).
우선, Service 클래스는 모든 요청에 대해 RestTemplate의 새 인스턴스를 만듭니다. 나는 그것이 얼마나 나쁜 연습인지 충분히 강조 할 수 없다. RestTemplate 타입의 bean을 생성하여 Service bean에 삽입하십시오 (사용중인 Spring MVC 버전에 따라 이미 생성되었을 가능성이 큽니다).
일단 가지고 있다면, RestTemplates 둘 다 : Service bean에있는 것이고 FeatureFlipperManagerTest에 주입 된 것이 모두 동일 할 것이고 MockRestServiceServer로 테스트 할 수있을 것입니다.
수정 - 더 명확하게 :
Service 클래스를 다음과 같이 수정하십시오.
@Component public class Service { private RestTemplate restTemplate; @Autowired public Service(RestTemplate restTemplate) { this.restTemplate = restTemplate; } public boolean isEnabled(String xxx) { ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class); if(...)return true; return false; } }
테스트 클래스를
@RunWith(MockitoJUnitRunner.class) public class FeatureFlipperManagerTest { @Autowired RestTemplate restTemplate; @Autowired Service service; MockRestServiceServer mockServer = MockRestServiceServer.createServer(restTemplate); @Test public void test() throws Exception { mockServer.expect(requestTo(Mockito.anyString())) .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON)); boolean res = service.isEnabled("xxx"); mockServer.verify(); Assert.assertEquals(true, res); } }
이것이 RestTemplate 빈이 없다는 예외로 실패하면 사용중인 Spring (Spring Boot?) 버전에 대한 정보를 붙여 넣으십시오.
-
==============================
2.스프링에 의해 제공되는 RestTemplate을 사용하기를 원한다고 생각하기 때문에 Spring 후에 RestTemplate을 autowired해야만 createServer를 작성해야합니다. 나는 당신이 이렇게 할 수 있다고 생각합니다 :
스프링에 의해 제공되는 RestTemplate을 사용하기를 원한다고 생각하기 때문에 Spring 후에 RestTemplate을 autowired해야만 createServer를 작성해야합니다. 나는 당신이 이렇게 할 수 있다고 생각합니다 :
@RunWith(MockitoJUnitRunner.class) public class FeatureFlipperManagerTest { @Autowired RestTemplate restTemplate; Service service; MockRestServiceServer mockServer; @Before public void init() { service = new Service(); service.setRestTemplate(restTemplate); // If you have autowired restTemplate in Service, you can just autowired the service mockServer = MockRestServiceServer.createServer(restTemplate); } @Test public void test() throws Exception { mockServer.expect(requestTo(Mockito.anyString())) .andRespond(withSuccess("{\"enabled\":true}", MediaType.APPLICATION_JSON)); boolean res = service.isEnabled("xxx"); mockServer.verify(); Assert.assertEquals(true, res); } }
from https://stackoverflow.com/questions/42409768/how-to-mock-resttemplate-with-mockrestserviceserver by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring bean은 동시성을 어떻게 처리하나요? (0) | 2019.07.13 |
---|---|
[SPRING] Spring의 Json 응답 시간대 문제 (0) | 2019.07.13 |
[SPRING] Junit에서 @Autowired 주석과 함께 @InjectMocks를 사용하는 방법 (0) | 2019.07.13 |
[SPRING] @jobscope 빈을 Spring batch에서 분할 단계로 액세스 (0) | 2019.07.13 |
[SPRING] Spring 데이터 나머지 @EmbeddedId는 Post 요청에서 생성 할 수 없습니다. (0) | 2019.07.13 |