Мокито тестирование Отдых клиента - PullRequest
0 голосов
/ 25 ноября 2018

Мне трудно проводить юнит-тестирование с клиентом Rest.Я пытаюсь смоделировать остальной вызов и вернуть определенный объект, чтобы проверить его значение.Но я получаю java.lang.IllegalArgumentException: URI is not absolute как ошибку.

Я знаю, что есть способ использовать mockServer, но я думаю, что это полезно только при тестировании ответов, но не тела.

Я запускаю его с SpringBoot.Вот мой код:

Сервис:

@Service
public class ServiceImpl implements Service {

    private final String url;
    private RestTemplate restTemplate = new RestTemplate();

    public ServiceImpl(@Value("${call.url}") String url) {
        this.url = url;
    }

    @Override
    public MyObject getMyObject(String param1, String param2) {
        MyObject myObject;

        try {
            myObject = restTemplate.getForObject(url, MyObject.class, param1, param2);
        } catch (HttpClientErrorException e) {
            throw new MyObjectException();
        }
        return myObject;
    }
}

Тест:

@InjectMocks
@Spy
private Service service;
MyObject found = mock(MyObject.class);

@Mock
RestTemplate restTemplate;

@Before
public void setup() {
    MockitoAnnotations.initMocks(this);
}

@Test
public void() test{
   MyObject myObject = new MyObject();
   myObject.setField(value);

    //Given
    Mockito.when(restTemplate.getForObject(
        Mockito.anyString(),
        ArgumentMatchers.any(Class.class), 
        Mockito.anyString(), 
        Mockito.anyString()))
    .thenReturn(myObject);

    found = service.getMyObject("param1", "param2");
    //Then
    assertEquals(myObject.getField(), found.getField());
}

1 Ответ

0 голосов
/ 25 ноября 2018

Когда вы вызываете service.getMyObject("param1", "param2");, вы создаете новый экземпляр RestTemplate, для которого вы делаете реальный вызов метода getForObject, вы можете реализовать, например, PowerMock и сделать что-то подобное:

@RunWith(PowerMockRunner.class)
@PrepareForTest(ServiceImpl.class)
public class ServiceImplTest {

    @InjectMocks
    @Spy
    private Service service;
    MyObject found = mock(MyObject.class);

    @Mock
    RestTemplate restTemplate;

    @Before
    public void setup() {
      MockitoAnnotations.initMocks(this);
    }

    @Test
    public void test() {
      MyObject myObject = new MyObject();
      myObject.setField(value);

      //Given
      whenNew(RestTemplate.class).withNoArguments().thenReturn(restTemplate);
      Mockito.when(restTemplate.getForObject(
          Mockito.anyString(),
          ArgumentMatchers.any(Class.class),
          Mockito.anyString(),
          Mockito.anyString()))
          .thenReturn(myObject);

      found = service.getMyObject("param1", "param2");
      //Then
      assertEquals(myObject.getField(), found.getField());
    }
  }
...