SpringBoot:测试服务层

ste*_*ipe 5 spring unit-testing spring-boot

让我们假设我有两个类:

  1. TodoRepository
  2. 服务

TodoRepository是一个简单的 CRUD 存储库:

public interface TodoRepository extends CrudRepository<T, ID> {
}
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我应该费心测试服务层吗?

编辑:

感谢@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));
    }
}
Run Code Online (Sandbox Code Playgroud)

Dhe*_*rik 6

是的,这很重要。

即使是现在是一个非常简单的类,也许在未来的某个开发人员可以在这个方法中添加一些奇怪的情况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));

}
Run Code Online (Sandbox Code Playgroud)