java - 使用 JUnit 和 Mockito 编写单元测试

标签 java spring-boot unit-testing junit 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 进行测试,但我对通常要测试的内容有点困惑。我应该为此方法编写多少个测试?我需要测试流吗(我什至不知道如何)?您如何决定在方法中测试什么?

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

@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 个负流。您的积极场景可能是您期望值不存在于您的数据库中并成功存储数据,而您的消极场景可能是当该数据已经存在时您抛出异常。这是您应该编写的最少两个测试用例。

关于java - 使用 JUnit 和 Mockito 编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71996081/

相关文章:

spring - 作为查询参数传递给 spring restcontroller 的语言环境列表在测试时显示不规则行为

unit-testing - 示例无效的 utf8 字符串?

java - 抽象成员不能直接访问 : Kotlin

java - 空字符串还是非空字符串?

java - 一类 svm 是否提供概率估计?

java - 如何从Java读取Excel中删除空格

java - 对于使用 spring-boot 的多模块 Maven 项目,通用模型和实用程序的正确位置

java - Spring Boot中取消授权

javascript - AngularJS Jasmine, Controller 中的测试功能

javascript - 使用异步 ajax 调用的 Sinon/Mocha 测试没有返回 promise