我正在使用单元/集成测试开发Java Web应用程序。应用程序被部署到Jetty,并在运行Maven的集成测试阶段时使用H2数据库。我有一个从dao层调用的oracle函数,它无法迁移到H2 db,因此我想在运行测试用例的时候在代码中模拟/跳过这部分代码。如何在java中单元测试时跳过一段代码
我想有一个标志,可以告诉我是否在测试模式下运行应用程序,并将条件放入代码中,但看起来并不像对我更清洁。请建议最佳方法来实现这一点。
我正在使用单元/集成测试开发Java Web应用程序。应用程序被部署到Jetty,并在运行Maven的集成测试阶段时使用H2数据库。我有一个从dao层调用的oracle函数,它无法迁移到H2 db,因此我想在运行测试用例的时候在代码中模拟/跳过这部分代码。如何在java中单元测试时跳过一段代码
我想有一个标志,可以告诉我是否在测试模式下运行应用程序,并将条件放入代码中,但看起来并不像对我更清洁。请建议最佳方法来实现这一点。
将Oracle本地调用解压缩到单独的类(可能是某些DAO)。将该DAO注入到使用它的类中。创建该DAO的第二个实现,而不是调用Oracle。在集成测试期间注入后一种实现。
避免您的代码中的标志。如果您使用的是Spring,请使用构建配置文件来选择性地创建一个或另一个实现。
这就是依赖注入如何帮助你测试你的代码:如果你想模拟系统的某个部分,只需注入模拟版本。
如果问题确实是:
如何在Java
然后我给出的答案同意单元测试时,我跳过一段代码。依赖注入,嘲讽框架绝对是真正的单元测试的正确途径。
但是,如果问题是:
使用JUnit(或其他单元测试框架)
然后我想答案是,当我如何跳过一段代码“这取决于” 。有时我使用JUnit进行集成测试 - 我在测试服务器上运行客户端代码片段,以帮助我省去通过GUI手动执行这些客户端测试的麻烦。在这种情况下,我在我的基类使用的系统属性,比如我有:
protected boolean skipTest()
{
String port = System.getProperty("jersey.test.port");
// don't run this test unless developer has explicitly set the testing properties
// this is an integration test, not a unit test
return port == null;
}
然后在实际的测试类,它看起来像这样:
// verify a successful login
@Test
public void testLogin()
{
if (skipTest())
return;
// do real test
所以,我的想法是,如果你真的不能重构你的DAO中的Oracle东西,然后你真的在做一个集成测试,在你的单元测试中有一个skipTest是可以的。
优秀!这个对我有用。我使用Spring 3.1的来注入依赖于我运行应用程序的环境的依赖关系。然而,其他解决方案也取决于情况。 –
Pankaj
@Pankaj:所以你完全按照我的方式做到了这一点。很高兴我能帮上忙。 –