Mockito:如何测试更改私有字段值的方法?

时间:2019-05-27 22:10:47

标签: junit mockito

我有一个方法void create(File file);,它在一个类中创建数据结构(地图),该方法将实例化数据并将其放入私有字段:

private Map<String> myMap

课程的

现在我要对创建的方法进行单元测试,我该怎么做? 谢谢!

3 个答案:

答案 0 :(得分:1)

您可以通过反射来访问您的属性(例如,参见here),但是您需要对类进行黑客检查以检查函数执行的结果的事实听起来像是设计的味道。单元测试应从头到尾检查单元的行为。突变对象的内部状态是一种副作用,应与预期是否已从被测单元调用某些突变方法进行检查。....在实践中,您可以尝试模拟Map.put()和验证已被调用,而不是检查地图本身

答案 1 :(得分:0)

class MyClass {
    private final Map<K, V> map;

    MyClass() {
        // production ctr
        this(new HashMap<>();
    }

    MyClass(Map<K, V> map) {
        // visible for testing
        this.map = map;
    }

    void create...

通过这种方式,您的测试可以注入地图并断言create会导致预期的副作用

答案 2 :(得分:0)

您可以使用@InjectMocks和@Mock注释。

以下是具有最新Mockito版本(v2.27)的JUnit 5的示例。

class SomeClass {

    private Map<String, String> myMap = new HashMap<>();

    public boolean doSomething(String fileName) {
        return myMap.containsKey(fileName);
    }
}

@ExtendWith(MockitoExtension.class)
class SomeClassTest {

    @InjectMocks
    SomeClass someClass;

    @Mock
    Map<String, String> map;

    @Test
    public void test() {

        Mockito.when(map.containsKey("test")).thenReturn(true);

        Assert.assertTrue(someClass.doSomething("test"));

        Mockito.verify(map, Mockito.times(1)).containsKey("test");
    }
}