gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:25:24 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com