Как смоделировать REST API в модульном тестировании? - PullRequest
1 голос
/ 26 января 2020

Я использую метод RestTemplate exchange HttpMethod.POST для отправки в конечную точку. В моем тестовом файле я проверяю success метода POST. Однако с моими текущими тестами я получаю 401 Unauthorized error, когда сделан запрос POST. Мне нужна помощь для моделирования API при создании запроса POST в тестовом файле

Вот мой основной файл


@Component
public class DataTestRepo {

    private final RestTemplate restTemplate;
    private final String url;
    private final AllBuilder headersBuilder;

    public DataTestRepo(
            @Qualifier(Oauth.BEAN_NAME) AllBuilder headersBuilder,
            RestTemplate restTemplate, String url) {
        this.headersBuilder = headersBuilder;
        this.restTemplate = restTemplate;
        this.url = url;
    }
    public ResponseEntity<String> postJson(Set<String> results) {
        ResponseEntity<String> result = null;

        try {
            JSONObject jsonObject = new JSONObject(body);

            HttpEntity<String> request = new HttpEntity<String>(jsonObject.toString(), null);
            restTemplate.getMessageConverters().add(stringConvertor);
            result = restTemplate.exchange(url, HttpMethod.POST,
                    new HttpEntity<>(request, getHttpHeaders()), String.class);
         } 
        return result;
    }
}

Вот мой тестовый файл

@RunWith(MockitoJUnitRunner.class)
@TestPropertySource
public class DataTestRepoTest {

    private static final String url = "http://localhost:8080/data/name";

    @Mock
    private DataTestRepo DataTestRepo;
    RestTemplate restTemplate = new RestTemplate();

    @Test
    public void restTemplateHttpPost_success() throws URISyntaxException {
        URI uri = new URI(url);
        Set<String> mockData = Stream.of("A","B").collect(Collectors.toSet());
        Map<String, String> body = new HashMap<>();
        body.put("Name", "Aws");
        JSONObject jsonObject = new JSONObject(body);

        HttpEntity<String> request = new HttpEntity<>(jsonObject.toString(), null);

        ResponseEntity<String> result = restTemplate.exchange(uri, HttpMethod.POST,
                new HttpEntity<>(request, DataTestRepo.getHttpHeaders()), String.class);

        Assert.assertEquals(201, result.getStatusCodeValue());
    }
}


Ответы [ 2 ]

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

Вы тестируете логи c внутри класса DataTestRepo, поэтому не стоит насмехаться над ним. RestTemplate является зависимостью внутри DataTestRepo, так что это именно то, что вам нужно издеваться. В целом, в вашем тесте это должно выглядеть следующим образом:

@InjectMocks
private DataTestRepo DataTestRepo;
@Mock
RestTemplate restTemplate;

Кроме того, вам нужно будет указать возвращаемое значение для вашей смоделированной зависимости, например:

Mockito.when(restTemplate.exchange(ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any(), ArgumentMatchers.any())).thenReturn(new ResponseEntity<>(yourExpectedDataHere, HttpStatus.OK));
enter code here

Это просто простой пример. Хорошей практикой будет проверка того, что аргументы, передаваемые на ваш макет, соответствуют ожидаемым. Одним из способов было бы заменить ArgumentMatchers.any () реальными ожидаемыми данными. Другой - проверить это отдельно, например:

Mockito.verify(restTemplate, Mockito.times(1)).exchange(ArgumentsMatchers.eq(yourExpectedDataHere), ArgumentsMatchers.eq(yourExpectedDataHere), ArgumentsMatchers.eq(yourExpectedDataHere), ArgumentsMatchers.eq(yourExpectedDataHere));
0 голосов
/ 26 января 2020

Это отличная статья на этом топи c: https://reflectoring.io/spring-boot-web-controller-test/

...