2013-02-01 46 views
1

这是一个有趣的应用程序。Junit使用数据库访问测试多线程应用程序

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

  1. 在@BeforeClass我建立了数据库连接查询是在测试环境中有效的上下文。
  2. 在Servlet测试中,我使用HttpUnit获取InvocationContext,然后是该servlet的一个实例。
  3. 然后,我调用servlet中执行所有工作的主要方法,并最终调用线程管理器以获取适当的分发方法,并使用之前定义的ThreadPool。
  4. 问题出现在派生线程中。使用@BeforeClass中创建的上下文设置,servlet的数据库访问工作得很好。线程无权访问该上下文,并且无法获取数据库连接信息,从而导致线程代码失败。

因此,底线,任何人都有一个想法如何测试线程代码,这是想要数据库访问?甚至是一种全新的单元测试方法,可以与需要访问数据库的多线程应用程序一起使用。

任何其他细节可以提供给一个点。我希望我已经提供了足够的信息,提供实际的代码不是必需的。

+0

为了测试目的,您可以使用['MoreExecutors.sameThreadExecutor()']替换'ThreadPoolExecutor'(http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/util /concurrent/MoreExecutors.html#sameThreadExecutor())?你也可以定义在线程中不可用的* context *吗? –

+1

如果你打的是数据库,那就是集成测试,而不是单元测试 –

+0

你真的需要连接到数据库吗? – imrichardcole

回答

0

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

+0

似乎合理。我会在下次添加更多测试时尝试。 – ahillman3

相关问题