在JUnit中测试REQUIRES_NEW

时间:2012-01-30 11:21:39

标签: java spring spring-transactions

运行我的测试时,它会在调用method()时挂起。难道我做错了什么?救命啊!

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"beans.xml"})
@Transactional(rollbackFor = Exception.class)
public class Test {
    @Test
    public void test() {
        itemUnderTestDao.method();
        // ...
    }
}

public class ItemUnderTestDao {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void method() {
        // ...
    }
}

忘记上面的代码。我现在已经在http://www44.zippyshare.com/v/46865082/file.html上传了一个Eclipse项目(不包括像spring这样的依赖项)。关于如何让测试通过的所有输入都非常感谢!如果我有两个sqlite数据库和两个dataSources,则测试通过...

2 个答案:

答案 0 :(得分:0)

您正尝试打开与数据库的第二个连接。由于@Transactional TestREQUIRES_NEW上的method()强制另一个连接,因此打开了第一个。

您的连接池可能只允许一个并发连接。检查其大小和数据库配置。

同时检查您的问题并将选定的答案标记为已接受(答案正文旁边的复选标记形状)。

答案 1 :(得分:0)

正如mrembisz所说,你正试图同时获得2个连接/线程。

  1. 对于测试本身,将在测试期间存在
  2. 用于方法调用,该调用将在调用期间存在。
  3. 我在一些不同的情况下遇到了同样的事情。

    有两种方法可以解决这个问题:

    1. 将传播更改为REQUIRED,这样您就可以重复使用最初获得的测试的连接。
    2. 增加池大小,但请记住,您需要考虑同时更新的最大数量,大致 maxThreadPoolSize >= (maxSimultaniousUpdates + 1) + (min size for other activities) (如果您在列表1挂起连接,最终所有挂起的操作会完成)。 Othrewise会再次出现在制作中。
    3. 第一种解决方案在我看来更好,如果它不会损害你的逻辑:)