首页 > 解决方案 > SpringBoot:测试服务层

问题描述

假设我有两个类:

  1. 待办事项库
  2. 待办事项服务

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));
    }
}

标签: springunit-testingspring-boot

解决方案


是的,这很重要。

即使现在是一个非常简单的类,也许未来的一些开发人员可能会在这个方法上添加一些不再保存的奇怪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));

}

推荐阅读