Насмешливый объект возвращает ноль - PullRequest
1 голос
/ 10 января 2020

Класс тестирования JUnit:

public class TestingClass {

    @Mock
    private RestTemplate restTemplate;

    @Mock
    private HttpEntity entity;

    @Mock
    private ResponseEntity<Resource> responseEntity;

    @Before
    public void setup() {

        MockitoHelper.initMocks(this);

    }

    @Test
    public void getDataTest() {

        ClassToTest c = new ClassToTest(restTemplate);

        when(restTemplate.exchange("http://testing", HttpMethod.GET, entity, Resource.class)).thenReturn(responseEntity);
        c.getData("http://testing");

    }

}

Тестируемый класс:

import org.jsoup.helper.Validate;
import org.springframework.core.io.Resource;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;

import java.io.InputStream;
import java.util.Optional;

public class ClassToTest {

    private HttpHeaders headers;
    private RestTemplate restTemplate;

    public ClassToTest(RestTemplate restTemplate){
        this.restTemplate = restTemplate;
        headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
    }

    public Optional<InputStream> getData(final String mediaUrl) {

        Validate.notEmpty(mediaUrl);

        final String requestJson = "{}";
        final HttpEntity<String> entity = new HttpEntity<>(requestJson, headers);
        Optional inputStreamOptional = Optional.empty();

        try {
            final ResponseEntity<Resource> responseEntity = restTemplate.exchange(mediaUrl, HttpMethod.GET, entity, Resource.class);
            System.out.println(responseEntity);
        } catch (Exception exception) {
            exception.printStackTrace();
        }

        return inputStreamOptional;
    }
}

Результат System.out.println(responseEntity); равен null.

Следует responseEntity установить его смоделированное значение и вернуть (вместо текущего поведения, когда возвращается ноль), как настроено в: when(restTemplate.exchange("http://testing", HttpMethod.GET, entity, Resource.class)).thenReturn(responseEntity);

Так, когда c.getData("http://testing"); вызывается, смоделированный responseEntity возвращается?

Вместо этого используйте обновление:

when(restTemplate.exchange(Matchers.eq("http://testing"), Matchers.eq(HttpMethod.GET), Matchers.isA(HttpEntity.class), Matchers.eq(Resource.class))).thenReturn(responseEntity);

Ответы [ 3 ]

2 голосов
/ 10 января 2020

Скорее всего, возвращается ноль, потому что ваше определение параметра в when и фактические параметры отличаются. В вашем случае очень вероятно, что ваши смоделированные entity и HttpEntity, которые вы создаете в тестируемом коде, не одинаковы и не равны. Так что вам нужно расширить свои ожидания в when -определении. Вы должны использовать Matchers в вашем определении, и они могут использовать isA(HttpEntity.class) для вашей сущности.

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

Проблема сосредоточена вокруг этой строки в вашем тесте:

when(restTemplate.exchange("http://testing", HttpMethod.GET, entity, Resource.class)).thenReturn(responseEntity);

То, что это говорит о том, что возвращает ваш ложный responseEntity, когда вы вызываете restTemplate.exchange с этими Speci c аргументы. Обратите внимание, что одним из этих аргументов является ваша фиктивная сущность. Однако в вашем ClassToTest эта фиктивная сущность - это не то, что передается в restTemplate.exchange. Поэтому, когда вы запускаете тест, вы никогда не получите точную сигнатуру метода, ожидаемую вашей заглушкой.

Попробуйте вместо этого:

when(restTemplate.exchange(eq("http://testing"), eq(HttpMethod.GET), any(HttpEntity.class), eq(Resource.class))).thenReturn(responseEntity);

Это заменит указанные параметры c на совпадения, и вызовет ваш метод-заглушку для любого HttpEntity, а не для указанного c mock one.

Обратите внимание, что если вы используете какие-либо сопоставления вообще, вы должны использовать сопоставители для все параметры, для чего предназначен метод eq().

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

Я думаю, что вам не нужно издеваться над ResponseEntity, так как ResponseEntity не тот, кто вводится. Вы высмеяли ResponseEntity, а затем никогда не высмеивали ни один из его методов, поэтому его null.

Вам нужно высмеять RestTemplate, а затем высмеять его:

when(restTemplate.exchange("http://testing", HttpMethod.GET, entity, Resource.class)).thenReturn(responseEntity);
...