Класс тестирования с защищенным конструктором с PowerMock и Mockito - PullRequest
2 голосов
/ 25 марта 2012

У меня есть следующий класс для тестирования:

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

Я получаю исключение NullPointerException из-за "полученныйResult1 = challengeMock.toStrings ();" который возвращает ноль.

Я использую PowerMock + Mockito, работающий в Robolectric с правилом (потому что это проект Android).

@Rule
public PowerMockRule rule = new PowerMockRule();

Где проблема?

1 Ответ

4 голосов
/ 26 марта 2012

Вам не нужен PowerMock для этого;Mockito будет просто замечательно.Но обычно макет не имеет функциональности в своих методах, поэтому toStrings() не возвращает ожидаемое вами значение.Чтобы изменить это, вам нужен ответ по умолчанию CALLS_REAL_METHODS.

Поэтому я рекомендую изменить строку, в которой вы создаете макет (третья непустая строка testToStrings), примерно так

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

Я проверил это, и ваш тест пройден, если вы сделаете это изменение.

...