【发布时间】: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 你是对的,这实际上是集成测试。我已经实现了所有实际上没有集成的单元测试。代码覆盖的下一个挑战是命中需要数据库访问功能的代码。
标签: java database multithreading junit