Как заглушить вызов метода родительского класса в моем смоделированном абстрактном классе, который я хочу протестировать с помощью PowerMock - PullRequest
0 голосов
/ 19 декабря 2018

Вот моя структура класса

public abstract class MyTabFragment extends Fragment {


public void myMethod(final Parameter reason) {
    if (isAdded()) {
        getActivity().runOnUiThread(() -> {
            if (getActionDelegateHandler() != null) {
                getActionDelegateHandler().handleThis(reason.getMessageId());
            } else {
                Log.e(TAG, "no action handler");
            }
        });
    }
}

А вот мой тестовый класс.По сути, я хочу выполнить модульное тестирование myMethod (), в котором есть вызовы родительского класса Fragment 'isAdded () и getActivity ().Я хочу заглушить эти вызовы методов, но не могу.

@Test
public void testattempt() throws Exception {

    MyTabFragment testFragment = PowerMockito.mock(MyTabFragment.class);
    PowerMockito.doCallRealMethod().when(testFragment).myMethod(any(Parameter.class));

    when(testFragment.isAdded()).thenReturn(true); //This line throws error
    when(testFragment.getActivity()).thenReturn(fragmentActivity);
    when(testFragment.getActionDelegateHandler()).thenReturn(null);
    doAnswer(new Answer<Object>() {
        @Override
        public Object answer(InvocationOnMock invocation) throws Throwable {
            Runnable runnable = (Runnable) invocation.getArguments()[0];
            runnable.run();
            return null;
        }
    }).when(fragmentActivity).runOnUiThread(any(Runnable.class));


    testFragment.myMethod(mockParameter);
    //asserts here...
    //verify(testFragment).getActionDelegateHandler();
}

Запуск теста выдает ошибку в строке, где я высмеиваю вызов isAdded ().

org.mockito.exceptions.misusing.MissingMethodInvocationException: 
when() requires an argument which has to be 'a method call on a mock'.
For example:
    when(mock.getArticles()).thenReturn(articles);
Or 'a static method call on a prepared class`
For example:
    @PrepareForTest( { StaticService.class }) 
    TestClass{
       public void testMethod(){
           PowerMockito.mockStatic(StaticService.class);
           when(StaticService.say()).thenReturn(expected);
       }
    }

Also, this error might show up because:
1. inside when() you don't call method on mock but on some other object.
2. inside when() you don't call static method, but class has not been prepared.

Как мне решить это.Я использую PowerMock.Любая помощь приветствуется.Спасибо

1 Ответ

0 голосов
/ 20 декабря 2018

Неважно.Я обнаружил, что обычные ложные звонки действительно работают.Проблема заключалась в том, что в моем методе setup () я подавил все вызовы суперкласса.После того, как я сменил только те супер-вызовы, которые мне были нужны, для других тестов я смог, как обычно, смоделировать ожидаемые методы.

...