【发布时间】:2016-04-02 12:41:09
【问题描述】:
我正在用 Java Spring 编写一个由层组成的应用程序。他们的职责是:
- REST/Controller 层 - 处理传入请求、用户身份验证、解析请求正文并根据请求与服务层通信
- 服务层 - 主要处理创建/编辑/删除实体之间的关联和实体的状态。与 DAO 层和“实用程序”通信
- DAO 层 - 持久性,将保存/删除/查找请求的实体
- 实体/对象? layer - 代表应用领域的对象,相当愚蠢的功能,主要用于跟踪关联
- “实用程序”层 - 不是真正的层,提供诸如检查对象之间的权限之类的服务(对象 A 想要将对象 B 添加到对象 C,因为它需要权限 XYZ...)等
我在开发过程中一直在编写一些测试,现在我已经考虑过了,它们是一种集成测试。测试的一般流程可以描述为:
- 调用serviceX创建对象A
- 调用serviceX创建对象B
- 调用 serviceY 来处理对象 A 和 B
- 调用 serviceX 报告对象 A 和 B 的状态并检查是否一切正确
在每个步骤中,服务调用 DAO 层和保存/创建/获取的对象,然后对其进行操作,测试检查操作是否成功并符合预期。
我正在考虑正确的单元测试应该是什么样子。我知道我应该模拟测试服务所依赖的每个组件,以便我可以“隔离”我想要测试的行为。然而,服务的大多数方法实际上并没有“返回”任何东西,它们只是操纵实体。
然后我的问题是 - 对应用程序的层/服务进行单元测试是否总是有意义,或者将它们作为一个整体进行测试是否可以接受?
附录
其中一种方法的示例。这个负责将新用户添加到组中。添加成员必须由组的经理完成。所以逻辑是:
- 获取参数 - manager、group、newUser
- 如果任何参数为空,则抛出异常
- 调用
permissionHandler服务并检查manager用户在group中是否有足够的权限来完成这个动作 - 检查
newUser是否已存在于组中。如果是,则抛出异常。 - 如果一切正常,调用
groupMemberHelper服务创建一个新的GroupMember对象,表示user和group之间的关联(以及有关关联的更多信息) - 将此
GroupMember对象添加到组中 - 对于组已拥有的所有“项目”,调用帮助服务,在这些项目和新添加的用户之间创建链接。
为了测试此方法,我将跟踪 group、newUser 以及此方法影响的所有对象,并检查状态“之前”和“之后”是否符合我的预期。
如果不依赖被调用服务的功能,我想不出另一种方法来测试它。我错了吗?
【问题讨论】:
标签: java spring unit-testing layer