我正在尝试使用PowerMockito间谍测试一些代码,并且我正在存根一个方法(getRootTagMap--见下文)以返回在测试器中构造的值(使用PowerMockito,因为该方法是私有的。
但是,它始终调用实际方法,而不是返回构造的值,而不是返回值。
不知道我做错了什么
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.powermock.api.mockito.PowerMockito.spy;
@RunWith(PowerMockRunner.class)
@PrepareForTest({JsonAppMessageProcessor.class})
public class TestPropStoreAppController {
@Test public void testSaveJsonAppTagChangesToPropStore() throws Exception {
JsonAppMessageProcessor messageProcessorSpy = spy(new JsonAppMessageProcessor());
when(messageProcessorSpy, "getRootTagMap", any(JsonAppTag.class)).thenReturn(constructReturnValue());
// I tried it this way too...
// doReturn(constructReturnValue()).when(messageProcessorSpy, "getRootTagMap", any(JsonAppTag.class));
// the following call calls the real getRootTagMap(JsonAppTag) method instead of returning the stub
messageProcessorSpy.saveChanges(constructParameterForChanges());
}
}
我不知道您正在使用的PowerMockito版本是什么,但以下方案对我有用:
doReturn(constructReturnValue()).when(messageProcessorSpy).getRootTagMap(any(JsonAppTag.class));
对间谍对象进行模拟的方法的调用应在 when
方法返回的实例中调用,而不是像在常规模拟对象中那样在实例内部调用。