PowerMockito 不服从 when.thenReturn
PowerMockito not obeying when.thenReturn
我正在使用 PowerMockito 验证私有方法的调用次数:loadProperties()
。
我也将该方法存根为 return 预定义值。
即使我有方法存根,真正的实现被调用,并抛出一个 NullPointerException
,因为它的依赖("loader" 变量,见下面的片段)没有定义(也没有应该是)用于此测试。
作为实验,我把方法改成了public,然后就可以正常使用了!
我认为这是 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
class 看起来像这样
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
。这是错误还是功能?
您没有为模拟准备 Config
class,因此 PowerMock
无法处理它。只需将它添加到 @PrepareForTest
注释中,你应该没问题:
@PrepareForTest({Config.class, DArgumentsLoader.class})
我正在使用 PowerMockito 验证私有方法的调用次数:loadProperties()
。
我也将该方法存根为 return 预定义值。
即使我有方法存根,真正的实现被调用,并抛出一个 NullPointerException
,因为它的依赖("loader" 变量,见下面的片段)没有定义(也没有应该是)用于此测试。
作为实验,我把方法改成了public,然后就可以正常使用了!
我认为这是 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
class 看起来像这样
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
。这是错误还是功能?
您没有为模拟准备 Config
class,因此 PowerMock
无法处理它。只需将它添加到 @PrepareForTest
注释中,你应该没问题:
@PrepareForTest({Config.class, DArgumentsLoader.class})