Рубрики
Без рубрики

Новая конечная точка Rest API: от начала до тестирования в Java и SpringBoot

Новая конечная точка Rest API: от начала до тестирования в Java и SpringBoot Привыкайте к тестированию вашего кода. С тегами webdev, тестирование, java, учебник.

Я хочу подробно описать шаги, которые Я пытаюсь использовать при создании новой конечной точки в бэкэнд-проекте (Java, SpringBoot, Mockito). Определенно, это не одно и то же все время, но это не тема для этого поста.

Задача состоит в том, чтобы внедрить новую конечную точку, которая извлекает все продукты, существующие на данный момент.

Шаги:

  1. создайте новый метод в классе службы, который извлекает данные с помощью слоя сохранения( здесь запросы не разрешены) все доступные продукты
  2. создайте конечную точку, которая вызывает описанный выше метод службы и возвращает данные
  3. создайте модульный тест для метода обслуживания
  4. создайте интеграционный тест для новой конечной точки.

Это мой способ тестирования, вы можете смешивать точки, как вам нравится.

Мы разделяем уровни сохранения (VendorProductRepository) и бизнеса (vendorproductservice).

public List findAllProducts() {
        return getVendorProductsRepository().findAll();
}

Это фактическая конечная точка, которая в данном случае имеет одну строку. Он просто возвращает результат вызова службы.

@GetMapping("/")
public ResponseEntity getAllProducts() {
   return ResponseEntity.ok(vendorProductsService.findAllProducts());
}

Этот модульный тест описывает “дано” – “когда” – “тогда”. Мы создаем фиктивный объект, который добавляем в список. Данная часть – это когда мы описываем (заглушка), что будет делать код, когда репозиторию будет предложено вернуть все продукты. Часть “когда” – это когда мы вызываем метод обслуживания, а часть “затем” – это когда мы проверяем, что издевательский вызов службы возвращает первоначально заданный список.

@Test
public void findAllProducts_always_returns_all_existing_products() {
        List productList = new ArrayList<>();
        productList.add(EntityHelper.convertToAbstractEntity(vendorProductDto, VendorProduct.class));
        when(repository.findAll()).thenReturn(productList);

        List foundProducts = subject.findAllProducts();

        assertNotNull(foundProducts);
        assertEquals(foundProducts.size(), productList.size());
}

Этот интеграционный тест описывает правильный путь для получения списка всех доступных продуктов. Он попадает в базу данных, поэтому лучше всего использовать его версию для разработчиков. Мы выполняем Http-вызов и проверяем ответ и тело HttpStatus.

@Test
public void testGetAllProducts_shouldReturn_list_of_existing_products() {
        VendorProduct vendorProduct = new VendorProduct();
        vendorProduct.setId(1L);
        vendorProduct.setName("Mint Plants will be deleted");
        vendorProduct.setMinQuantityPerOrder(3d);
        vendorProduct.setMaxQuantityPerOrder(100d);
        vendorProduct.setQuantityType(QuantityType.ITEM.getIndex());
        List existingProducts = new ArrayList<>();
        existingProducts.add(vendorProduct);

        ResponseEntity getResponse =  getRestTemplate().getForEntity(getRootUrl() + "/products/", List.class);
        assertEquals(HttpStatus.OK, getResponse.getStatusCode());
        assertEquals(existingProducts, getResponse.getBody());
}

Именно тогда я чувствую себя более уверенным в том, что добавление новой конечной точки для выполнения чего-либо действительно сработает. Этот код на самом деле является частью моего проекта #twiliohackathon, поэтому код доступен здесь https://github.com/gabrielaradu/BuyLocalServerSide

Счастливого кодирования.

Оригинал: “https://dev.to/gabriela/new-endpoint-from-start-to-test-3n9f”