【问题标题】:How do I skip a section of code when unittesting in java在java中进行单元测试时如何跳过一段代码
【发布时间】:2012-09-25 23:56:05
【问题描述】:

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

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

【问题讨论】:

    标签: java unit-testing integration-testing


    【解决方案1】:

    将 Oracle 本机调用提取到一个单独的类(可能是某些 DAO)中。将该 DAO 注入到使用它的类中。创建该 DAO 的第二个实现,不做任何事情来代替调用 Oracle。在集成测试期间注入后一种实现。

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

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

    【讨论】:

    • 太棒了!这个对我有用。我使用 spring 3.1 的 注入基于我运行应用程序的环境的依赖项。但是,根据场景,其他解决方案也很好。
    • @Pankaj:所以你的做法和我一样。很高兴我能帮上忙。
    【解决方案2】:

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

    请注意:您可能需要重构代码以使其更具可测试性。

    【讨论】:

      【解决方案3】:

      如果问题真的是:

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

      那么我同意给出的答案。依赖注入、模拟框架绝对是进行真正单元测试的正确方法。

      但是如果问题是:

      在使用 JUnit(或其他单元测试框架)时如何跳过一段代码

      那么我认为答案是“视情况而定”。有时我使用 JUnit 进行集成测试——我在测试服务器上运行客户端代码的 sn-ps,从而省去了通过 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 是可以的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 1970-01-01
        • 1970-01-01
        • 2018-03-06
        相关资源
        最近更新 更多