SpringBoot:测试服务层

时间:2018-11-30 15:44:45

标签: spring unit-testing spring-boot

让我们假设我有两个课:

  1. TodoRepository
  2. TodoService

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

2 个答案:

答案 0 :(得分:2)

是的,很重要。

即使现在是一个非常简单的类,也许是一些开发人员,将来都可能会在此方法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));

}

答案 1 :(得分:0)

我已经看到这种东西使用Junit使用Mock框架进行了测试,并将模拟回购注入服务,然后调用了模拟回购。对我来说,这似乎毫无意义,因为测试对实现的了解太多。如果您更改实现,则必须重写测试,因此它对重构没有用。

我将通过将应用程序像黑盒子一样对待的集成测试来测试这种事情。即启动应用程序,触发创建待办事项的所有内容并检查其是否已创建。我可能会使用Cucumber-jvm,并有一个场景,其中包含一个步骤来创建待办事项,另一个步骤来检索待办事项。

我认为您应该创建测试

  • 帮助您编写可靠的代码
  • 允许重构,而无需重写测试
  • 证明应用程序可以执行预期的操作