PowerMockito Mocking whenNew не вступает в силу

Описание:

Кажется, что мои заглушки или макеты не влияют на тестируемый мной класс. Я пытаюсь использовать действие whenNew, чтобы имитировать возвращаемый объект, а затем имитировать операцию над этим объектом с возвращенным значением.

Я представляю, что это что-то простое, чего мне не хватает, но я этого не вижу.

РЕШЕНИЕ: Изначально я работал с MockitoRunner.class, и его нужно было изменить на PowerMockRunner.class. Код ниже отражает решение.

Jars в пути к классам:

  • powermock-mockito-1.4.11-full.jar
  • mockoito-all-1.9.0.jar
  • javassist-3.15.0-GA.jar
  • junit-4.8.2.jaf
  • objensis-1.2.jar
  • cglib-nodep-2.2.2.jar

ТЕСТОВЫЙ КЛАСС

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

    }

Реализация класса А

public class ClassA implements IClassA {

    @Override
    public String[] runTest(String[] inputValues) {

        String[] result;
        IClassB classB = new ClassB();
        result = classB.getResult(inputValues);

        return result;
    }

} 

person haju    schedule 14.08.2012    source источник


Ответы (1)


Поскольку вы используете функции powermock (@PrepareForTest, PowerMockito.whenNew и т. Д.), Вам нужно запустить тест с PowerMockRunner.

@RunWith(PowerMockRunner.class)

Поскольку ClassB # geResult не является частным, вы также можете упростить свой код и заменить

when( mockedClassB, "getResult", any(String[].class) ).thenReturn(someValue); 

by

when(mockedClassB.getResult(any(String[].class))).thenReturn(someValue);
person gontard    schedule 14.08.2012
comment
Пробовал это, и он терпит неудачу на any (String []. Class)), говоря, что здесь обнаружено неуместное сопоставление аргументов. Похоже, что при насмешке очень сложно передать массив. - person haju; 15.08.2012
comment
Я не понимаю, в моей среде это работает. Попробуйте также: when (mockedClassB.getResult (any (String []. Class))). ThenReturn (someValue); - person gontard; 15.08.2012
comment
Я завершаю свой ответ. В завершение вопроса укажите некоторые сведения о вашей среде: версии junit, powermock, powermockito и mockito. Предоставляет также значение someValue в ClassATest # mockingTest. - person gontard; 15.08.2012
comment
Я удалил все, начал все заново и решил проблему, с которой столкнулся. Обновлено описание, чтобы показать основную проблему, решение и дополнительную конфигурацию. - person haju; 15.08.2012