如何在java中进行单元测试时跳过一段代码

时间:2012-10-04 21:02:02

标签: java unit-testing integration-testing

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

我想过有一个标志可以判断我是否在测试模式下运行应用程序并将条件放入代码中,但对我来说看起来不那么干净。请提出实现这一目标的最佳方法。

3 个答案:

答案 0 :(得分:3)

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

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

依赖注入可以帮助您测试代码:如果您想模拟系统的某些部分,只需注入模拟版本。

答案 1 :(得分:1)

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

请注意:您可能需要对代码进行重新分解,以使其更易于测试。

答案 2 :(得分: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。