使用 JUnit 和 Mockito 编写单元测试

Writing unit test with JUnit and Mockito

我在服务层中有一个方法可以将项目保存到数据库中。此方法首先检查数据库中是否存在同名的项目。如果有,那么它会抛出一个异常并显示一条消息,如果没有则它只是保存新项目。这是代码;

public TodoList saveTodoList(TodoList todoList) {
    List<TodoList> match = StreamSupport.stream(getAllTodoLists().spliterator(), false)
            .filter(list -> list.getName().equals(todoList.getName()))
            .collect(Collectors.toList());

    if (match.size() > 0)
        throw new ExistingDataException("Todo List already exists!");
    else
        return todoListRepository.save(todoList);
}

我正在尝试学习使用 JUnit 5 和 Mockito 进行测试,但我对通常要测试的内容有点困惑。我应该为此方法编写多少个测试?我需要测试流吗(我什至不知道如何)?您如何决定在方法中测试什么?

编辑:这是我的测试 class 和保存方法的测试方法;

@ExtendWith(MockitoExtension.class)
class TodoListServiceTest {
    @Mock
    private ITodoListRepository todoListRepository;

    @InjectMocks
    private TodoListService todoListService;

    @Test
    @DisplayName("Should save the list to the repository")
    public void whenGivenTodoListDoesNotExistInDatabase_ThenSaveNewList() {
        TodoList mockList = mock(TodoList.class);
        mockList.setId(1);
        mockList.setName("List 1");

        when(todoListRepository.save(any(TodoList.class))).thenReturn(mockList);

        TodoList actual = todoListService.saveTodoList(mockList);

        assertEquals(mockList.getId(), actual.getId());
        assertEquals(mockList.getName(), actual.getName());
    }

    @Test
    @DisplayName("Should throw exception if there is a list with given item's name")
    public void shouldThrowExistingDataException_IfThereIsAList_WithTheSameName() {
        TodoList mockList = mock(TodoList.class);
        mockList.setId(1);
        mockList.setName("List 1");

        Throwable actualException = assertThrows(ExistingDataException.class,
        () -> {
            todoListService.saveTodoList(mockList);
        });

        assertTrue(actualException.getMessage().contains("Todo List already exists!"));
    }

我将尝试回答您提出的一些问题:

我应该为这个方法写多少个测试?: 本质上,在为一个函数或一段代码编写测试用例时,你应该写多少个测试用例是没有限制的写。通常,您尝试测试至少 1 个正流量和 1 个负流量。如果您的代码片段有很多边缘情况,那么也可以检查一下。

我需要测试流吗(我什至不知道如何)? : 否。Stream 是内置的 java 功能,您无需测试内置功能。你只是测试你的逻辑。

你如何决定在一个方法中测试什么?: 正如我之前提到的,你通常测试正流和负流,包括任何边缘情况。对于上述功能,您似乎有 1 个正流和 1 个负流。您的积极场景可能是您期望值不存在于您的数据库中并成功存储数据,而您的消极场景可能是当该数据已经存在时您抛出异常。这是您应该编写的最少两个测试用例。