【问题标题】:Mocking a static class field using JMockit使用 JMockit 模拟静态类字段
【发布时间】:2014-07-16 14:13:49
【问题描述】:

我已经重构了一个类,我目前正在尝试更新单元测试以反映这一点。类的一个附加部分是一个静态字段,如下所示:

private static JdbcTempate jdbcTemple = DbConfiguration.getJdbcTemplate();

在添加此字段后运行单元测试时,出现空指针错误。我通过使用带有createMock()WhiteBox.setInternalState() 方法的powermock 模拟该字段来解决这个问题,很简单。

但是,其中一个测试套件使用 JMockit 而不是 powermock 和 mockito。谁能告诉我如何使用 JMockit 模拟这个字段?

【问题讨论】:

    标签: java unit-testing jmockit


    【解决方案1】:

    使用 JMockit 可以轻松编写测试:

    @Test
    public void setStaticField(@Mocked JdbcTemplate mockTemplate)
    {
        Deencapsulation.setField(ClassUnderTest.class, mockTemplate);
    
        assertSame(mockTemplate, ClassUnderTest.getJdbcTemplate());
    }
    

    mockit.Deencapsulation 类等同于WhiteBox,包括设置静态最终字段的能力。

    【讨论】:

      【解决方案2】:

      不确定这是否是您想要的,但您可以模拟 DbConfiguration 并训练它为 getJdbcTemplate 方法返回所需的值:

      在你的TestClass中添加:

       @Mocked
       private DbConfiguration dbConfiguration;
      

      在你的 testMethod 中添加:

      new NonStrictExpectations() {{
          DbConfiguration.getJdbcTemplate();
          result = new JdbcTemplate( "mock" ); // or return what ever you want your private field to  contain...
      }};
      

      在实例化拥有此私有静态字段的 ClassUnderTest 时,该字段的值由“result = ...”定义。

      【讨论】:

      • 这是正确的,但它仅适用于包含静态字段的类在执行测试时尚未被 JVM 初始化的情况。如果是的话,那么DbConfiguration.getJdbcTemplate()在测试的时候就不会被调用,期望也没有效果。
      猜你喜欢
      • 2013-07-14
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-12
      • 2010-09-18
      相关资源
      最近更新 更多