PowerMockito不遵守when.thenReturn

时间:2015-01-06 19:57:56

标签: mockito powermock

我正在使用PowerMockito来验证私有方法的调用次数:loadProperties()。 我也有该方法存根以返回预定义的值。

即使我有方法存根,也会调用真正的实现,并抛出NullPointerException,因为它的依赖关系(" loader"变量,请参阅下面的代码片段)未定义(也不应该进行这项测试。

作为一项实验,我将方法改为公开,然后就可以正常使用了!

我认为这是PowerMockito中的一个错误,但我对这些事情的确比错了!

这是代码

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import java.util.HashMap;
import java.util.Map;

import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.times;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.when;


@RunWith(PowerMockRunner.class)
@PrepareForTest({DArgumentsLoader.class})
public class TestConfig {
 @Test
 public void testGetPropertyMapCalledOnce() throws Exception {
     Config configMock = mock(Config.class);
     Map<String, String> testMap = new HashMap<String, String>();
     testMap.put("xx", "xx");
     when(configMock, "loadProperties").thenReturn(testMap);

     when(configMock.getString(anyString(), anyString())).thenCallRealMethod();
     // call it twice
     configMock.getString("xx", "yy");
     configMock.getString("xx", "yy");
     // verify loadProperties was only called once
     PowerMockito.verifyPrivate(configMock, times(1)).invoke("loadProperties");
 }
}

为了澄清,Config类看起来像这样

private Map<String, String> loadProperties() throws IOException, HttpException {
    return loader.loadProperties();
}

public String getString(String key, final String defaultValue) {
    String value = getPropertyMap().get(key);
    if(value != null) {
        return value;
    } else {
        return defaultValue;
    }
}

private Map<String, String> getPropertyMap() throws LoadException {
    if(propertyMap == null) {
        propertyMap = loadProperties();
    }
    return propertyMap;
}

鉴于测试人员说

,根本不应该调用loadProperties()方法
when(configMock, "loadProperties").thenReturn(testMap);

但它正在被召唤,它正在抛出一个NullPointerException。这是一个错误还是一个功能?

1 个答案:

答案 0 :(得分:1)

您没有准备Config类进行模拟,因此PowerMock无法处理它。只需将其添加到@PrepareForTest注释中,您就可以了:

@PrepareForTest({Config.class, DArgumentsLoader.class})