SpringBoot: тестирование сервисного уровня - PullRequest
0 голосов
/ 30 ноября 2018

Давайте предположим, что у меня есть два класса:

  1. TodoRepository
  2. TodoService

TodoRepository - это простой CRUD-репозиторий:

public interface TodoRepository extends CrudRepository<T, ID> {
}

TodoService - это просто класс, вызывающий этот репозиторий:

@Service
public class TodoService{

    private final TodoRepository todoRepository;

    @Autowired
    public TodoService(TodoRepository todoRepository) {
        this.todoRepository = todoRepository;
    }

    public void createTodo(Todo todo) {
        todoRepository.save(todo);
    }
}

Стоит ли проверять уровень обслуживания?

Редактировать:

Благодаря объяснению от @Dherik.Я создал тестовый класс, который выглядит следующим образом:

Примечание: Я использую JUnit5, Mockito и Spring Framework

@ExtendWith(SpringExtension.class)
class TodoServiceTest {

    @MockBean
    private TodoRepository todoRepository;

    private TodoService todoService;

    @BeforeEach
    void setUp() {
        todoService = new TodoService(todoRepository);
    }

    @AfterEach
    void tearDown() {
        clearInvocations(tanklevelRepository);
    }

    @Test
    public void createTodo() {
        todoService.createTodo(new Todo());

        // verify if the save method is called when createTodo is called too
        verify(todoRepository, times(1)).save(any(Todo.class));
    }
}

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Да, это важно.

Даже сейчас, будучи очень простым классом, возможно, разработчиком, в будущем можно добавить странное условие для этого метода createTodo, что Todo больше не сохраняется.

Если вы напишете тест для фактического метода, чтобы проверить, вызван ли save, разработчик будет проинформирован о ситуации, если он внесет некоторые изменения, которые влияют на сохранение Todo.

См. Пример псевдо-теста:

@Test
public void createTodo() {

    TodoRepository todoRepository = mock(TodoRepository.class);

    TodoService todoService = new TodoService(todoRepository);
    todoService.createTodo(new Todo());

    // verify if the save method is called when createTodo is called too
    verify(todoRepository, times(1)).save(any(Todo.class));

}
0 голосов
/ 30 ноября 2018

Я видел, как подобные вещи тестировались с помощью Junit с использованием фреймворка Mock и внедрением фиктивного репо в сервис, после чего была вызвана проверка фиктивного репо.Это кажется мне действительно бессмысленным, поскольку тест слишком много знает о реализации.Если вы измените реализацию, вам придется переписать тест, чтобы он не использовался для рефакторинга.

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

Я думаю, вам следует создать тесты, которые

  • помогут вам написатьнадежный код
  • позволяет проводить рефакторинг без необходимости переписывать тесты
  • доказать, что приложение выполняет то, что должно
...