Как смоделировать RestTemplate в Java Spring boot? - PullRequest
1 голос
/ 14 января 2020

Я пытаюсь смоделировать RestTemplate getEntity() метод, используя приведенный ниже код, но я получаю исключение, и я новичок в модульном тестировании

Может кто-нибудь помочь мне, пожалуйста, в чем моя ошибка

Класс

public List<SampleObject1> getGitHubUSersList(){

        try {
            ResponseEntity<SampleObject1[]>responseEntity = restTemplate.getForEntity("https://api.github.com/users", SampleObject1[].class);
            List<SampleObject1>arrayList  = Arrays.asList(responseEntity.getBody());
            System.out.println("final list is---->"+objectMapperl.writeValueAsString(arrayList));
            return arrayList;
        }catch (Exception e) {
           e.printStackTrace();
        }
        return null;
    }

Тестовый класс

public class SampleServiceTest1 {

    @Mock
    RestTemplate mockrestTemplate;

    @InjectMocks
    @Spy
    SampleService1 sampleService;

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

@SuppressWarnings("unchecked")
@Test
public void getGitHubUSersListTest() {

    List<SampleObject1> sampleObject1s = new ArrayList<>();

    SampleObject1 sampoleObject1 = new SampleObject1();
    sampoleObject1.setId(1);
    sampoleObject1.setLogin("sample1");
    sampoleObject1.setNode_id("sample2");
    sampleObject1s.add(sampoleObject1);

    SampleObject1 sampoleObject2 = new SampleObject1();
    sampoleObject2.setId(2);
    sampoleObject2.setLogin("sample3");
    sampoleObject2.setNode_id("sample4");
    sampleObject1s.add(sampoleObject2);

    Mockito.doReturn(sampleObject1s).when(mockrestTemplate).getForEntity(Matchers.anyString(),  ArgumentMatchers.any(Class.class));

    List<SampleObject1> list = sampleService.getGitHubUSersList();

    assertNotNull(list);
}

}

Ошибка

org.mockito.exceptions.misusing.NullInsteadOfMockException: 
Argument passed to when() is null!
Example of correct stubbing:
    doThrow(new RuntimeException()).when(mock).someMethod();
Also, if you use @Mock annotation don't miss initMocks()
    at com.example.microservice.service.SampleServiceTest1.getGitHubUSersListTest(SampleServiceTest1.java:50)

Ответы [ 3 ]

1 голос
/ 14 января 2020

Ваша ложная настройка неверна getForEntity не возвращает List<SampleObject1>, поэтому вы не можете установить это как возврат, вам нужно вернуть ResponseEntity<SampleObject1[]>.

Итак, чтобы решить вашу проблему. Объявить новый макет

@Mock
private ResponseEntity<SampleObject1[]> mockResponseEntity

doReturn(mockResponseEntity).when(mockrestTemplate).getForEntity(anyString(),  any(Class.class));
doReturn(new SampleObject1[]{sampoleObject1, sampoleObject2}).when(mockResponseEntity).getBody();
0 голосов
/ 16 января 2020

Это должно работать.

Я предполагаю, что ответ restTemplate будет списком, а не массивом.

@RunWith(MockitoJUnitRunner.class)
public class SampleServiceTest {

    @InjectMocks
    private SampleService sampleService;

    @Mock
    private RestTemplate restTemplate;

    @Test
    public void name() {
        List<Pair> restResponseList = Arrays.asList(Pair.with("K1","V1"),Pair.with("K2","V2"));

        when(restTemplate.getForEntity(any(String.class), Matchers.<Class<List>>any()))
                .thenReturn(new ResponseEntity<>(
                        restResponseList,
                        new HttpHeaders(),
                        HttpStatus.OK));

        List<Pair> testResponse =sampleService.getGitHubUSersList();
        assertEquals(Pair.with("K1","V1"),testResponse.get(0));
        assertEquals(Pair.with("K2","V2"),testResponse.get(1));
    }
}
0 голосов
/ 14 января 2020

Я вижу две потенциальные проблемы с кодом выше, которые, по-моему, необходимо исправить для правильной работы теста:

  1. Вам необходимо применить @RunWith(MockitoJUnitRunner.class) к строке объявления класса (т.е. 1005 *).
  2. При использовании аннотаций @InjectMocks и @Spy необходим фактический экземпляр. Таким образом, я бы изменил вашу строку SampleService1 sampleService; на что-то вроде SampleService1 sampleService = new SampleService1();

Для примеров по выполнению этих двух вещей ознакомьтесь с этой полезной статьей Baeldung об аннотациях Mockito .

...