2017-02-23 20 views
4
public class ServiceTest { 
    @Mock 
    RestTemplate restTemplate = new RestTemplate(); 
    @InjectMocks 
    Service service = new Service(); 
    ResponseEntity responseEntity = mock(ResponseEntity.class); 

    @Test 
    public void test() throws Exception { 
     Mockito.when(restTemplate.getForEntity(
       Mockito.anyString(), 
       Matchers.any(Class.class) 
       )) 
       .thenReturn(responseEntity); 
     boolean res = service.isEnabled("something"); 
     Assert.assertEquals(res, false); 
    } 

Я попытался протестировать простой тест на услугу, включающую в себя restclient. Похоже, я не успел успешно завершить RestTemplate. Похоже, что код получает реальные данные не издевательски. Любой может помочь мне в этом.Как издеваться над RestTemplate в Java Spring?

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

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

ответ

4

Проблема в том, что в вашем isEnabled вы создаете новый RestTemplate. Это неверно по двум причинам: один из них заключается в том, что вы не можете издеваться над ним, так как вы создаете новый, а во-вторых, не следует создавать новые объекты для каждого запроса. RestTemplate является потокобезопасным и, следовательно, может быть членом класса сервиса, который используется во многих потоках.

Измените класс обслуживания на что-то вроде этого:

public class Service{ 

    RestTemplate restTemplate = new RestTemplate(); 

    public boolean isEnabled(String xxx) { 
     ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class); 
     if(...)return true; 
     return false; 
    } 
} 

Теперь, когда ваш RestTemplate стал членом класса теперь вы можете правильно издеваться через один из двух способов. Один, введите его с помощью @InjectMock или используйте метод настройки, который вы вызываете из своего теста.

Поскольку вы используете InjectMock в своем коде, мы можем пойти с этим.

@RunWith(MockitoJUnitRunner.class) 
public class ServiceTest { 
    @Mock 
    RestTemplate restTemplate; 
    @InjectMocks 
    @Spy 
    Service service; 
    ResponseEntity responseEntity = mock(ResponseEntity.class); 

    @Test 
    public void test() throws Exception { 
     Mockito.when(restTemplate.getForEntity(
       Mockito.anyString(), 
       Matchers.any(Class.class) 
       )) 
       .thenReturn(responseEntity); 
     boolean res = service.isEnabled("something"); 
     Assert.assertEquals(res, false); 
    } 

Обратите внимание, что я внесла несколько изменений. Сначала я удалил new RestTemplate() и new Service(). Вы должны позволить mockito создавать их для вас. Комментируя их с помощью @Mock и @Spy, вы убедитесь, что Mockito создаст их для вас, и, что еще более важно, будет вводить насмешки в ваш объект service.

3

тест рамки Spring MVC в предложил класс MockRestServiceServer для модульного тестирования кода RESTful службы.

Это tutorial о его использовании.

+0

Я пробовал учебник, но он не работает. http://stackoverflow.com/questions/37781982/mocking-a-rest-call-with-mockrestserviceserver – c2340878

+0

https://github.com/jeffsheets/MockRestServiceServerExample –

0

Если вы используете @Autowired, вы можете использовать MockRestServiceServer. Ниже приведен образец.

@Service 
public class Service{ 
    @Autowired 
    private RestTemplate restTemplate; 

    public boolean isEnabled(String xxx) { 
     ResponseEntity<String> response = restTemplate.getForEntity("someurl",String.class); 
     if(...)return true; 
     return false; 
    } 
} 

@Service необходимо использовать @Autowired для создания объекта автоматически.

+0

Я пробовал, но он вернет ошибку, что restTemplate равно null. И, похоже, я не могу добавить restTemplate bean. Есть ли что-то еще, что я могу сделать, чтобы проверить это? Мне просто нужно высмеять ответ RestTemplete. – c2340878

+0

Извините, я пропустил добавление значимой аннотации к классу. Повторите мой ответ. – hiroyukik

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