为模拟类的私有字段分配新值

时间:2014-08-14 19:52:17

标签: java mockito powermock

将HashSet的新实例分配给模拟类的私有字段是主要问题。在模拟类中,我尝试为私有字段分配新值。结果,我做了以下实施;然而,似乎反思不适用于模拟类。因此,如何使用Powermockito将新值分配给模拟类的私有字段?

我的实施

 class Foo{
    private volatile Set<String> field;
 }

带反射

  Foo mock = mock(Foo.class);

  try{
       Field refField = mock.getClass().getDeclaredField("field");
       ...
  }catch( ... ) {

  }

getDeclaredField抛出&#34; NoSuchFieldException&#34;的异常。

我的目标是,如果没有抛出异常;

   refField.set(mock, new HashSet<String>());

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法。有趣但有效。

Foo fooInstance = new Foo();

try {
   whenNew(Foo.class).withAnyArguments().then(new Answer<Void>() {
        @Override
        public Void answer(InvocationOnMock invocation) throws Throwable {
            Field reflected = invocation.getClass().getDeclaredField("field");
            reflected.setAccessible(true);
            reflected.set(fooInstance, (new HashSet<String>()));

            return null;
        }

});
} catch (Exception e) {
      ....
}

在提出这个问题之后,one link来自右侧,作为建议,引起了我的兴趣。在看了那个问题后我找到了答案,有点灵感。