2012-10-04 85 views
4

我正在使用单元/集成测试开发Java Web应用程序。应用程序被部署到Jetty,并在运行Maven的集成测试阶段时使用H2数据库。我有一个从dao层调用的oracle函数,它无法迁移到H2 db,因此我想在运行测试用例的时候在代码中模拟/跳过这部分代码。如何在java中单元测试时跳过一段代码

我想有一个标志,可以告诉我是否在测试模式下运行应用程序,并将条件放入代码中,但看起来并不像对我更清洁。请建议最佳方法来实现这一点。

回答

3

将Oracle本地调用解压缩到单独的类(可能是某些DAO)。将该DAO注入到使用它的类中。创建该DAO的第二个实现,而不是调用Oracle。在集成测试期间注入后一种实现。

避免您的代码中的标志。如果您使用的是Spring,请使用构建配置文件来选择性地创建一个或另一个实现。

这就是依赖注入如何帮助你测试你的代码:如果你想模拟系统的某个部分,只需注入模拟版本。

+0

优秀!这个对我有用。我使用Spring 3.1的来注入依赖于我运行应用程序的环境的依赖关系。然而,其他解决方案也取决于情况。 – Pankaj

+0

@Pankaj:所以你完全按照我的方式做到了这一点。很高兴我能帮上忙。 –

1

请使用一些很好的Mocking框架,如mockitojMock或其他一些类似的模拟框架。

请注意:您可能需要重新考虑代码以使其更易于测试。

1

如果问题确实是:

如何在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是可以的。