Android Powermockito how to mock toast

Viewed 120

I am using powermockitor for test my login view model, and getting below issue when I answer for a mockitor case.

  • LoginViewModelTest.java
import android.app.Application;
import android.content.Context;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import okhttp3.MediaType;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;

@RunWith(PowerMockRunner.class)
@PrepareForTest(LoginViewModel.class)
@PowerMockIgnore({ "org.mockito.*", "org.robolectric.*", "android.*" })
public class LoginViewModelTest {

    @Mock
    private Context contextMock;
    @Mock
    private Application application;

    @Rule


    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testLogin_Succeed() throws Exception {
        Mockito.doReturn(contextMock).when(application).getApplicationContext();
        LoginViewModel loginViewModel = new LoginViewModel(application);

        AuthApiService doctorApiServiceMock = Mockito.mock(AuthApiService.class);
        Call<SessionResponse> responseCallMock = PowerMockito.mock(Call.class);

        // Set mocks up to be returned when constructed. This can be moved to a @Before and should still work
        PowerMockito.whenNew(AuthApiService.class)
                .withAnyArguments()
                .thenReturn(doctorApiServiceMock);

        Mockito.doReturn(responseCallMock).when(doctorApiServiceMock).accessAppSession(anyString(), anyString());

        Mockito.doAnswer((Answer<Callback<SessionResponse>>) invocation -> {
            Callback<SessionResponse> callback = invocation.getArgument(0, Callback.class);
            callback.onResponse(responseCallMock, Response.success(new SessionResponse()));
            return null;
        }).when(responseCallMock).enqueue(any(Callback.class));

        loginViewModel.login("testUser","testPass");
    }
}

  • Issuing case
java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.

    at android.os.Looper.getMainLooper(Looper.java)
    at android.arch.core.executor.DefaultTaskExecutor.postToMainThread(DefaultTaskExecutor.java:48)
    at android.arch.core.executor.ArchTaskExecutor.postToMainThread(ArchTaskExecutor.java:101)
    at android.arch.lifecycle.LiveData.postValue(LiveData.java:266)
    at android.arch.lifecycle.MutableLiveData.postValue(MutableLiveData.java:28)
    at com.cloudbreak.telemed.ui.login.LoginViewModel$1.onResponse(LoginViewModel.java:46)
    at com.cloudbreak.telemed.LoginViewModelTest.lambda$testLogin_Succeed$1(LoginViewModelTest.java:91)
    at org.mockito.internal.stubbing.StubbedInvocationMatcher.answer(StubbedInvocationMatcher.java:39)
    at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:96)
    at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29)
    at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:35)
    at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:61)
    at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor.doIntercept(MockMethodInterceptor.java:49)
    at org.mockito.internal.creation.bytebuddy.MockMethodInterceptor$DispatcherDefaultingToRealMethod.interceptAbstract(MockMethodInterceptor.java:126)
    at retrofit2.Call$MockitoMock$1730005656.enqueue(Unknown Source)
    at com.cloudbreak.telemed.ui.login.LoginViewModel.login(LoginViewModel.java:39)
    at com.cloudbreak.telemed.LoginViewModelTest.testLogin_Succeed(LoginViewModelTest.java:95)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:68)

I wanted to replace my JUnitRunner by Powermockrunnner (in order to further use features of Powermock that simple Mockito does not have). My LoginViewModel has posting value for a livedata state. How can I bypass this issuing case using mockito?

0 Answers
Related