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?