使用Transactional进行集成测试

时间:2014-08-05 08:48:18

标签: spring-security spring-data-jpa spring-test

我有以下场景/系统。 Spring安全配置背后的Rest Service提议,包含Spring JPA和postgres DB。

现在我的情景制作了一个 登录用户1
注销用户1
用户登录1 在资源上提出请求
注销用户1
用户登录2 在其他资源上提出请求
注销用户2

这一切都在测试方法上(我知道这样做可能是错误的)。 现在令我困惑的是,他有一些加密/解密方法来检索用户和他们的领域。现在我看到的是,在第1次登录时,用户通过解密代码(这没关系),在用户1的第二次登录后,我们不会通过解密代码(但用户已被登录)在)。 (这有点奇怪,我预计用户会通过解密代码),之后通过访问资源,用户2也会被解密(这是正确的)。 但是通过登录用户2,用户不会传递解密代码(我有一个例外,因为正常加密的字段现在被解密了)异常可以,但不是字段的事实被解密了。

现在只有在@Transactional下设置测试时才会抛出异常。 当我进行测试而不是@Transactional时,行为相同是正确的(登录用户的时间是解密的。)

现在我想:"测试不是@transactional"这是合乎逻辑的,但我有点担心我有一个缓存问题:这可以吗?我没有任何缓存配置(仅适用于ACL,不适用于用户管理)。 还关闭了休眠的二级缓存。

有没有办法找出某些缓存或内存强度是否内向?

Txs

1 个答案:

答案 0 :(得分:1)

如果没有看到您的实际代码和配置,我无法准确评估正在发生的事情;但是,我可以为您提供以下一般信息......

如果您正在模拟为您的应用程序建模不同外部连接的用例(即,两个独立用户通过REST API连接到您的应用程序),那么您不希望使用@Transactional注释您的测试方法

使用@Transactional注释测试方法会导致测试方法中方法调用的全部相同的事务[0]中执行。因此,JPA存储在第一级缓存中的任何项目都将在测试方法范围内的方法调用中缓存。

希望这有帮助!

萨姆

[0]此声明基于以下假设:您的测试方法直接或间接调用的方法均未配置为在新事务中运行。