복붙노트

[SPRING] MockRestServiceServer로 RestTemplate을 조롱하는 법?

SPRING

MockRestServiceServer로 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. ==============================

    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. ==============================

    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);
        }
    }
    
  3. from https://stackoverflow.com/questions/42409768/how-to-mock-resttemplate-with-mockrestserviceserver by cc-by-sa and MIT license