Тестировать или не тестировать — вот в чем вопрос…


Введение

При разработке программного обеспечения всегда возникает важный вопрос: должен ли я тестировать свой код? Ответ, вероятно, положительный, хотя большинство людей считают, что достаточно протестировать код вручную. Открою вам секрет: это не так! Юнит-тестирование очень важно, и я считаю, что каждый проект, который планируется поддерживать в рабочем состоянии более 6 месяцев, должен иметь тесты.

Единичное тестирование

преимущества

Юнит-тестирование имеет множество преимуществ, например, вы можете с большей уверенностью внедрять свой проект в производство, зная, что ваш код отвечает ожидаемым образом на все внешние ситуации. Кроме того, модульное тестирование поможет вам найти ошибки на ранней стадии процесса, а не в процессе производства.

Хорошо, но как это делается?

Вообще говоря, вы хотите тестировать отдельные компоненты вашего кода, например, у вас есть java-приложение, и вы решили протестировать один из ваших сервисов, например OrderImplService. Вы, вероятно, напишете модульные тесты для всех публичных методов вашего класса и протестируете все граничные случаи. Давайте рассмотрим пример:

Допустим, в нашей реализации сервиса есть такой метод:

@Override
public void changeOrderStatus(OrderStatus status, Long oid) {
      OrderEntity order = orderRepository.findOrderByOrderId(oid)
            .orElseThrow(() -> OrderNotFoundException.notFoundById(oid))
      order.setStatus(status);
      orderRepository.save(order);
  }
Войти в полноэкранный режим Выйти из полноэкранного режима

Этот метод изменяет статус заказа для заказа, имеющего предоставленный идентификатор заказа. Но как нам его протестировать? Мы создадим тестовый класс для нашего сервиса OrderServiceImplTest.java.

public class OrderSerivceImplTest {

   @Test 
   public void yourFirstTest(){

   }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Теперь наш сервис зависит от нескольких классов, но нас интересуют только те, которые находятся в тестируемом методе. Поэтому то, что нам действительно нужно — это OrderRepository. Но как хранилище будет реагировать, если у нас нет базы данных, ведь мы только тестируем. Для этого мы используем макеты, что в основном означает, что мы макетируем хранилище и говорим ему, что делать, возвращать и т.д.. Для этого мы будем использовать библиотеку под названием Mockito.
Так что давайте добавим ее сюда:


@RunWith(MockitoJUnitRunner.class)
public class OrderSerivceImplTest {

   @Mock
   private OrderRepository orderRepository;

   @InjectMocks
   private OrderService orderService;

   @Test 
   public void yourFirstTest(){

   }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Теперь мы подражали репозиторию и внедрили его в наш сервис. Теперь давайте создадим тест для нашего метода и дадим ему соответствующее имя. Мне нравится называть тесты следующим образом: givenSomething_expectOutcome().
Нам также нужно сообщить хранилищу, что делать, когда мы пытаемся получить заказ по id. Так что давайте реализуем это:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import path.to.order.repository.OrderRepository;

@RunWith(MockitoJUnitRunner.class)
public class OrderSerivceImplTest {

   @Mock
   private OrderRepository orderRepository;

   @InjectMocks
   private OrderService orderService;

   @Test 
   public void givenOrderIdAndStatus_expectChangeStatus(){     
      OrderEntity order = getOrderEntity(); 
      when(orderRepository.findOrderByOrderId(anyLong()).thenReturn(Optional.of(getOrderEntity));
      orderService.changeOrderStatus(OrderStatus.PROCCESING, "orderId")
      assertEquals(OrderStatus.PROCCESING, order.getStatus());
      verify(orderRepository).save(order);
   }

   private OrderEntity getOrderEntity(){
    .....
   }
}

Войти в полноэкранный режим Выйти из полноэкранного режима

Затем, вероятно, нужно создать тест для случая, когда хранилище заказов возвращает пустую опцию. Для этого вам нужно добавить @Test(expected=OrderNotFoundException.class) и затем заставить хранилище возвращать пустую опцию, а затем удалить assert и verify.

Тестирование очень важно, и вы должны начать внедрять его в свои проекты ПРЯМО СЕЙЧАС!!!

Оцените статью
devanswers.ru
Добавить комментарий