Spring Boot : Testing the Service layer

标签 spring unit-testing spring-boot

假设我有两个类:

  • TodoRepository
  • TodoService
  • TodoRepository是一个简单的 CRUD 存储库:
    public interface TodoRepository extends CrudRepository<T, ID> {
    }
    
    TodoService只是一个调用这个 Repository 的类:
    @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));
        }
    }
    

    最佳答案

    是的,这很重要。
    即使现在是一个非常简单的类,也许 future 的一些开发人员可以在这个方法上添加一些奇怪的条件 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));
    
    }
    

    关于 Spring Boot : Testing the Service layer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53560667/

    相关文章:

    java - 为什么spring boot vaadin app无法运行?

    java - Spring Thymeleaf 无法解析模板

    java - OpenMQ超时后消息丢失

    .net - 您建议使用什么 .net 测试框架?

    spring - Apache HttpClient 向 Spring @Controller 类进行多部分 POST

    java - Eclipse 中 Mule 的代码覆盖工具

    java - 使用 Mockito 模拟方法行为时以任何顺序匹配列表

    java - 如何实现 Multi-Tenancy Spring Boot 应用程序(每个用户都有自己的数据库)

    java - 无法解析值 'version.v1' 中的占位符 "/api/${version.v1}"

    java - 使用 servlet 过滤器时 App Engine 上的 Spring Boot 应用程序出现错误