Mockito:模拟私有字段初始化

2022-08-31 07:40:11

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

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

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

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


答案 1

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 类,这些类可能很有用,可以避免您拉入另一个库。


答案 2

参加派对很晚了,但我在这里被击中了,得到了朋友的帮助。关键是不要使用PowerMock。这适用于最新版本的Mockito。

莫基托带来了这个.org.mockito.internal.util.reflection.FieldSetter

它基本上可以帮助您使用反射修改私有字段。

这是你如何使用它:

@Mock
private Person mockedPerson;
private Test underTest;

// ...

@Test
public void testMethod() {
    FieldSetter.setField(underTest, underTest.getClass().getDeclaredField("person"), mockedPerson);
    // ...
    verify(mockedPerson).someMethod();
}

这样,您可以传递模拟对象,然后稍后对其进行验证。

这是参考。


推荐