Junit测试具有数据库访问权限的多线程应用程序[重复]

Posted

技术标签:

【中文标题】Junit测试具有数据库访问权限的多线程应用程序[重复]【英文标题】:Junit Testing a multithreaded application with Database access [duplicate] 【发布时间】:2013-01-17 08:27:58 【问题描述】:

这是一个有趣的。

我有一个在tomcat 下运行并具有servlet 访问权限的应用程序。底层实现使用 ThreadPoolExecutor 来细分任务,此时只是一个电子邮件分发器。我一直在添加 JUnit 测试,慢慢地将 cobertura 报告的代码覆盖率提高到几乎可以接受的水平。 JUnit 测试的一些背景知识:

    在@BeforeClass中,我正在为在测试环境中有效的数据库连接查找设置上下文。 在 Servlet 测试中,我使用 HttpUnit 来获取 InvocationContext,然后获取 servlet 的实例。 然后,我调用 servlet 中完成所有工作的主要方法,并最终调用线程管理器以获取适当的分发方法,并使用之前定义的 ThreadPool。 问题出现在衍生线程中。使用 @BeforeClass 中创建的上下文设置,来自 servlet 的 DB 访问工作得很好。线程无权访问该上下文,并且无法获取数据库连接信息,从而导致线程代码失败。

所以,归根结底,任何人都知道如何测试需要 DB 访问的线程代码?甚至是一种全新的单元测试方法,可以与需要 DB 访问的多线程应用程序一起使用。

任何额外的细节都可以提供给一个点。我希望我已经提供了足够的信息,不需要提供实际代码。

【问题讨论】:

您能否出于测试目的将ThreadPoolExecutor 替换为MoreExecutors.sameThreadExecutor()?您也可以定义线程中不可用的 context 吗? 如果你要访问数据库,那就是集成测试,而不是单元测试 这个测试你真的需要连接到数据库吗? @TomaszNurkiewicz 这很有趣,我会去看看。 @StephenConnolly 你是对的,这实际上是集成测试。我已经实现了所有实际上没有集成的单元测试。代码覆盖的下一个挑战是命中需要数据库访问功能的代码。 【参考方案1】:

我建议扩展发送到线程池的任务并将数据库上下文添加到扩展任务中,而不是在您编写的新测试中获取上下文并将其用于访问数据库。 我希望它能回答你的问题,如果没有,请添加一些代码示例,以便我能够对其进行测试。

【讨论】:

看起来很合理。下次我添加更多测试时我会尝试。

以上是关于Junit测试具有数据库访问权限的多线程应用程序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

填充具有访问权限的多对多表

具有内联汇编和访问 c 变量的多线程

使用 JUnit 测试具有 @PreAuthorize 的服务方法

多个线程可以具有只读访问权限的互斥模式

如何在Junit测试中运行Jmeter线程组

junit单元测试注意的问题