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

问题描述 投票:0回答:3

我有一个方法

void create(File file);
,它在类中创建数据结构(映射),它将实例化并将数据放入私有字段中:

private Map<String> myMap

班级。

现在我想对 create 方法进行单元测试,我该怎么做? 谢谢!

junit mockito
3个回答
1
投票

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


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
会导致预期的副作用


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");
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.