我有以下课程要测试:
public abstract class Challenge {
protected int id;
protected String name;
protected String question;
protected Challenge(){}
public String[] toStrings(){
String[] s = {Integer.toString(id), name, question};
return s;
}
...
但是使用这个测试:
@Test
public void testToStrings() throws Exception{
String[] expectedResult1 = new String[]{"1", "a", "b"};
String[] obtainedResult1 = null;
Challenge challengeMock = PowerMockito.mock(Challenge.class);
challengeMock.id = 1;
challengeMock.name = "a";
challengeMock.question = "b";
obtainedResult1 = challengeMock.toStrings();
Assert.assertEquals(expectedResult1[0], obtainedResult1[0]);
Assert.assertEquals(expectedResult1[1], obtainedResult1[1]);
Assert.assertEquals(expectedResult1[2], obtainedResult1[2]);
}
由于“gotResult1 = challengeMock.toStrings();”,我得到一个NullPointerException。返回null。
我使用在Robolectric运行的PowerMock + Mockito规则(因为它是一个Android项目)。
@Rule
public PowerMockRule rule = new PowerMockRule();
问题出在哪里?
答案 0 :(得分:4)
你不需要PowerMock;一个Mockito模拟会很好。但通常情况下,mock在其方法中没有任何功能,这就是toStrings()
没有返回您期望的值的原因。要更改此设置,您需要CALLS_REAL_METHODS
默认答案。
所以我的建议是将创建模拟的行(testToStrings
的第三个非空行)改为这样的。
Challenge challengeMock = Mockito.mock(Challenge.class, Mockito.CALLS_REAL_METHODS );
我已对此进行了测试,如果您进行此更改,则测试通过。