使用带有PowerMock和Mockito的Protected Constructor测试类

时间:2012-03-25 16:36:19

标签: java testing mockito powermock robolectric

我有以下课程要测试:

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();

问题出在哪里?

1 个答案:

答案 0 :(得分:4)

你不需要PowerMock;一个Mockito模拟会很好。但通常情况下,mock在其方法中没有任何功能,这就是toStrings()没有返回您期望的值的原因。要更改此设置,您需要CALLS_REAL_METHODS默认答案。

所以我的建议是将创建模拟的行(testToStrings的第三个非空行)改为这样的。

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

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