spring - SpringBoot:测试服务层
问题描述
假设我有两个类:
- 待办事项库
- 待办事项服务
这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 框架
@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));
}
}
解决方案
是的,这很重要。
即使现在是一个非常简单的类,也许未来的一些开发人员可能会在这个方法上添加一些不再保存的奇怪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));
}
推荐阅读
- fortran - Fortran 满足某些条件时如何跳过行?
- python - 基于单个字典中键的值的平均值和标准差
- android - 如果使用片段管理器和导航控制器,片段不可见
- java - 向/从此 Map 添加/删除时,如何扩展 java 的 HashMap 以添加钩子操作?
- python - 将 sigmoid 结果解释为神经网络中的概率
- r - 根据数字乘以行
- java - 更正 Docker 容器中 PostgreSQL 数据库的 JDBC 连接 URL
- excel - 我的问题是,如何将另一个单元格范围内的日期变暗?
- php - 以编程方式从购物篮中删除产品
- c# - 在 C#.Net 和实体框架中将数据从 API 添加到数据库?