【发布时间】:2014-07-24 07:03:23
【问题描述】:
我在集成测试和事务方面有点麻烦。
我有一个休息服务系统。毕竟我有一个 JPA 存储库,带有一个 Postgres 数据库。现在为了测试它们,我在系统上进行调用的地方构建了 JunitTest。测试加载 web 上下文和其他 xy 上下文,我在其中配置了安全和数据库连接。在测试方法上我有@Transactional 注释。
测试发出 2 个请求(这只是一个示例,我在其他对象上有更多类似场景):
- 插入新用户
- 在此用户上创建一个组,然后将其绑定到该用户
测试进行第一次调用,并返回我用于执行第二次调用的 id。 第二次调用获取 id 并发布帖子,我有几个问题。
第二次通话详情:
- 测试在控制器上发帖
- 控制器接收请求并将其转发给服务
- 服务方法(使用@Transactional)接受请求并执行:
- 寻找插入用户的研究
- 插入组对象
- 使用 groupId 更新用户(在第 2 点生成)
现在我遇到的问题之一是第 3.1 点的 AccessDeniedException,因为我也有 ACL,我必须检查是否有足够的权限。
我尝试做的一件事是设置:
@Transactional(propagation=Propagation.REQUIRES_NEW)
关于服务方法。 我得到的结果是 AccessDeniedException 消失了,但是 3.1 的研究给了我空的结果(研究还可以,因为在其他情况下我有正确的结果),但是很奇怪,因为第一篇文章还可以,我是如何了解 Spring 处理 @Transactions 并“提交”到数据库,以便在事务关闭时执行提交。这使我想到了另一个尝试:删除测试上的@Transaction 注释,但是当我这样做时,数据库将拥有此场景的所有数据,直到测试会话结束(如果您有很多测试这是不可取的),这不是一件好事。
现在我写了一些我的疑问,以及没有发布大量代码和隐私问题的问题,但我可以根据要求发布一些代码。 该方法也可能是不正确的。
问题是:
-我怎样才能使这项服务发挥作用?
-设置(propagation=Propagation.REQUIRES_NEW)的方式正确吗?
-这是在测试中设置@Transactional 的正确方法吗? (最终有回滚?)
发送很多。
为了进行测试,我使用 mockMvc 在类上发出请求和一些注释:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = { ..... })
@Transactional
public class tests {
@Test
public void aTest(){
mockMvc = MockMvcBuilders
.webAppContextSetup(webApplicationContext)
.addFilter(new DelegatingFilterProxy("springSecurityFilterChain", webApplicationContext), "/*")
.build();
mockMvc.perform(post(.....))
}
}
【问题讨论】:
-
这是什么测试,你是调用java方法还是通过http?您使用的是 spring-mvc 测试还是纯 http?
标签: spring postgresql jpa testing transactions