2017-02-23 3 views
0
@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를 사용하여 mock restTemplete를 사용하고 있습니다. 그러나 그것은 항상 실패합니다. java.lang.AssertionError: Further request(s) expected 0 out of 1 were executed으로 오류를 표시합니다. 어느 누구도 내가 제대로하지 않았 음을 알려줄 수 있습니다.MockRestServiceServer로 RestTemplet을 조롱하는 방법?

서비스 자체는 것입니다 모양이 같이 모든

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; 
    } 
} 

답변

0

먼저, Service 클래스는 모든 요청에 ​​RestTemplate의 새 인스턴스를 만듭니다. 나는 그것이 얼마나 나쁜 연습인지 충분히 강조 할 수 없다. RestTemplate 타입의 bean을 생성하고 이것을 Service bean에 삽입하십시오 (사용중인 Spring MVC 버전에 따라 이미 생성되었을 가능성이 큽니다).

일단 가지고 있다면 RestTemplates는 Service 콩에 하나, FeatureFlipperManagerTest에 주입 된 것은 모두 MockRestServiceServer으로 테스트 할 수 있습니다. 이가 말하는 예외가 발생하면

@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); 
    } 
} 

:

@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; 
    } 
} 

및 테스트 클래스 :

가 당신의 Service 클래스를 수정 : -

EDIT 더 명시합니다 RestTemplate bean present 다음은 사용중인 Spring (Spring Boot?) 버전에 대한 정보를 붙여 넣으십시오.

+0

내 문제를 해결하는 방법을 모르겠지만 귀하의 의견은 맞는 것 같아요. restTemplate 빈을 만들 수 없다면. 나머지를 조롱하기 위해 내가 할 수있는 다른 사람이 있습니까? 실제로 나는 get 호출의 응답을 조롱 할 필요가 있습니다. 이 작업을 수행 할 여지가 있습니까? – c2340878

0

스프링으로 제공되는 RestTemplate을 사용하려는 것이므로 스프링을 작성한 후 RestTemplate을 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); 
    } 
} 
+0

setRestTemplate (restTemplate)이라는 메서드를 찾을 수 없습니다. 왜? – c2340878