2017-02-23 101 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, чтобы имитировать restTemplete в службе. Но это всегда терпит неудачу. он показывает ошибку как java.lang.AssertionError: Further request(s) expected 0 out of 1 were executed. Любой мог сообщить мне, где я не делал этого правильно.Как издеваться над RestTemplet с MockRestServiceServer?

Сам сервис будет выглядит как это:

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 на каждом запросе. Я не могу подчеркнуть, насколько плохая практика. Создайте bean-тип типа RestTemplate и вставьте его в свой бонус Service (он скорее всего уже создан - в зависимости от используемой версии Spring MVC).

После того, как у вас есть, то оба RestTemplates: один в вашем Service фасоли и один вводят в FeatureFlipperManagerTest будет то же самое и тестирование с MockRestServiceServer будет возможно.

EDIT - быть более явным:

Измените 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 bean present, а затем вставьте информацию о версии Spring (Spring Boot?), которую вы используете.

+0

Я полагаю, что ваш комментарий правильный, хотя я не уверен, как исправить мою проблему. Если я не могу создать restTemplate bean. Есть ли что-нибудь, что я могу сделать, чтобы высмеивать restTemplete? и на самом деле мне просто нужно высмеять ответ на звонок. Есть какой-либо способ сделать это? – c2340878

0

Я думаю, вы имеете в виду, что хотите использовать RestTemplate, который предоставляется весной, поэтому вы должны создатьServer после того, как пружина автоматически отработала RestTemplate. Я думаю, вы можете сделать это вот так:

@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

 Смежные вопросы

  • Нет связанных вопросов^_^