【问题标题】:Mocking static private final variable using Powermock?使用Powermock模拟静态私有最终变量?
【发布时间】:2016-04-02 05:38:51
【问题描述】:

我有一个实用类,它是最终类。那里我用注入来注入LOGGER。

public final class Utilities {

    @Inject
    private static Logger.ALogger LOGGER;

    private Utilities() {
       //this is the default constructor. so there is no implementation
    }

    public static String convertToURl(string input){
       try{
             //do some job
          }catch(IllegalArgumentException ex){
             LOGGER.error("Invalid Format", ex);
          }
   }

}

当我为此方法编写单元测试时,我必须模拟 LOGGER,否则它将引发空指针异常。我如何在不创建此类的实例的情况下模拟此 LOGGER。我试图对变量进行白盒化。但它只适用于实例?

【问题讨论】:

  • 默认情况下,guice 不允许静态注入。但是我们可以请求this
  • 我不知道。我也没有用过,但是如果它能够注入静态字段,也许可以用它在单元测试中注入一个模拟记录器?
  • 嗯,最简单的解决方法是使变量包私有并将测试放在同一个包中,但必须有更好的方法。

标签: java unit-testing mockito powermock


【解决方案1】:

此代码运行良好。要设置静态字段,您需要将一个类传递给org.powermock.reflect.Whitebox.setInternalState。请确保使用 org.powermock.reflect 包中的 PowerMock 类,因为 Mockito 具有相同名称的类。

 @RunWith(PowerMockRunner.class)
 public class UtilitiesTest {

    @Mock
    private Logger.ALogger aLogger;

    @Before
    public void setUp() throws Exception {

        MockitoAnnotations.initMocks(this); // for case them used another runner
        Whitebox.setInternalState(CcpProcessorUtilities.class, "LOGGER", aLogger);
    }

    @Test
    public void testLogger() throws Exception {
        Utilities.convertToURl("");
        verify(aLogger).error(eq("Invalid Format"), any(IllegalArgumentException.class));
    }
}

【讨论】:

  • 它需要更新。不再使用白盒。
  • @user447607 “不再使用”是什么意思?该类仍然存在于 PowerMock 中并将被保留。我没有删除它的计划。可能你的意思是还有另一种方法!
  • 对不起,我会澄清的。该类仍然存在,但它被视为内部 API 的一部分,不推荐使用。
  • @user447607 我认为你混合了来自 Mockito 的 Whitebox 和来自 PowerMock 的 Whitebox。在 PowerMock 中,这个类是公开的。内部 API 为 WhiteboxImpl
  • 果然。原则上,我会将其命名为其他名称。好的,我会在系统解锁后修复我的投票。
猜你喜欢
  • 2013-10-02
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-25
  • 2018-07-29
  • 1970-01-01
相关资源
最近更新 更多