说明
我似乎无法让我的存根或模拟在我测试的课程中生效。我正在尝试使用whenNew操作,因此我可以模拟一个返回对象,然后使用返回值模拟该对象上的操作。
我想象一下我想念的东西很简单却没有看到它。
解决方案:我最初使用的是MockitoRunner.class
并且需要更改为PowerMockRunner.class
。以下代码反映了解决方案。
类路径上的Jars:
TEST CLASS
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import static org.powermock.api.mockito.PowerMockito.*;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.mockito.Matchers.any;
@RunWith(PowerMockRunner.class)
@PrepareForTest(ClassA.class)
public class ClassATest {
@Test
public void test() throws Exception
{
String[] returnSomeValue = {"PowerMockTest"};
String[] inputValue = {"Test1"};
ClassB mockedClassB = mock(ClassB.class);
whenNew( ClassB.class).withNoArguments().thenReturn( mockedClassB );
when( mockedClassB, "getResult", any(String[].class) ).thenReturn(returnSomeValue);
IClassA classUnderTest = new ClassA();
String[] expectedValue = classUnderTest.runTest(inputValue);
}
}
A类实施
public class ClassA implements IClassA {
@Override
public String[] runTest(String[] inputValues) {
String[] result;
IClassB classB = new ClassB();
result = classB.getResult(inputValues);
return result;
}
}
答案 0 :(得分:9)
由于您使用的是powermock功能(@PrepareForTest
,PowerMockito.whenNew
等),因此您必须使用PowerMockRunner运行测试。
@RunWith(PowerMockRunner.class)
因为ClassB#geResult不是私有的,所以您也可以简化代码并替换
when( mockedClassB, "getResult", any(String[].class) ).thenReturn(someValue);
通过
when(mockedClassB.getResult(any(String[].class))).thenReturn(someValue);