2

我有以下课程要测试:

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]);
}

由于“obtainedResult1 = challengeMock.toStrings();”,我得到了 NullPointerException 返回null。

我使用带有规则的在 Robolectric 中运行的 PowerMock + Mockito(因为它是一个 Android 项目)。

@Rule
public PowerMockRule rule = new PowerMockRule();

哪里有问题?

4

1 回答 1

4

为此,您不需要 PowerMock;一个 Mockito 模拟就可以了。但通常,模拟在其方法中没有任何功能,这就是为什么toStrings()没有返回您期望的值。要更改这一点,您需要CALLS_REAL_METHODS默认答案。

所以我的建议是将创建模拟的行(的第三个非空行testToStrings)更改为类似的内容。

Challenge challengeMock = Mockito.mock(Challenge.class, Mockito.CALLS_REAL_METHODS );

我已经对此进行了测试,如果您进行此更改,您的测试将通过。

于 2012-03-26T10:14:29.950 回答