Mockito:模拟私有字段初始化

新手上路,请多包涵

如何模拟正在内联初始化的字段变量?

 class Test {
    private Person person = new Person();
    ...
    public void testMethod() {
        person.someMethod();
        ...
    }
}

在这里,我想模拟 person.someMethod() 同时测试 Test.testMethod() 方法,我需要模拟 person 变量的初始化。有什么线索吗?

编辑: 我不允许修改 Person 类。

原文由 Arun 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

我已经找到了我忘记在这里发布的这个问题的解决方案。

 @RunWith(PowerMockRunner.class)
@PrepareForTest({ Test.class })
public class SampleTest {

@Mock
Person person;

@Test
public void testPrintName() throws Exception {
    PowerMockito.whenNew(Person.class).withNoArguments().thenReturn(person);
    Test test= new Test();
    test.testMethod();
    }
}

该解决方案的关键点是:

  1. 使用 PowerMockRunner 运行我的测试用例: @RunWith(PowerMockRunner.class)

  2. 指示 Powermock 准备 Test.class 用于操作私有字段: @PrepareForTest({ Test.class })

  3. 最后模拟 Person 类的构造函数:

PowerMockito.mockStatic(Person.class); PowerMockito.whenNew(Person.class).withNoArguments().thenReturn(person);

原文由 Arun 发布,翻译遵循 CC BY-SA 4.0 许可协议

Mockito 带有一个帮助类来为您节省一些反射样板代码:

 import org.mockito.internal.util.reflection.Whitebox;

//...

@Mock
private Person mockedPerson;
private Test underTest;

// ...

@Test
public void testMethod() {
    Whitebox.setInternalState(underTest, "person", mockedPerson);
    // ...
}

更新: 不幸的是,mockito 团队决定在 Mockito 2 中 删除该类。因此,您将返回编写自己的反射样板代码,使用另一个库(例如 Apache Commons Lang ),或者只是窃取 Whitebox 类(它是 MIT 许可 的)。

更新 2: JUnit 5 附带了自己的 ReflectionSupportAnnotationSupport 类,它们可能很有用,可以让您免于引入另一个库。

原文由 Ralf 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题