Я использую базу данных комнат в своем приложении. У меня есть функция входа в мое приложение, где после получения userId и пароля, по щелчку Login button
я вызываю API и сохраняю данные ответов в таблице базы данных комнаты после получения успешного ответа на обратный вызов от API.
Теперь я хочу написать интеграционные тесты для данных базы данных, где я использую mockWebServer , чтобы смоделировать ответ API и сохранить его в таблице базы данных комнаты.
А позже я получаю значения БД и проверяю, правильно ли они хранятся или нет, но я получаю ошибку ниже
java.lang.IllegalStateException: Невозможно получить доступ к базе данных в главном потоке, поскольку она может потенциально заблокировать пользовательский интерфейс на длительный период времени.
В этой строке authentication = authenticationDao.getAuthInformation ();
Ниже приведен код моего теста:
@RunWith(AndroidJUnit4.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class TestLogin {
@Rule
public InstantTaskExecutorRule mInstantTaskExecutorRule = new InstantTaskExecutorRule();
@Rule
public ActivityTestRule<LoginActivity> activityTestRule = new ActivityTestRule<>(LoginActivity.class, true, false);
@Rule
public MockWebServerTestRule mockWebServerTestRule = new MockWebServerTestRule();
@Mock
Application application;
LoginViewModel loginViewModel;
AppDatabase appDatabase;
AuthenticationDao authenticationDao;
Authentication authentication;
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
loginViewModel = new LoginViewModel(application);
ApiUrls.TOKEN = mockWebServerTestRule.mockWebServer.url("/").toString();
appDatabase = Room.inMemoryDatabaseBuilder(InstrumentationRegistry.getContext(),
AppDatabase.class).build();
authenticationDao = appDatabase.authenticationDao();
activityTestRule = new ActivityTestRule<>(LoginActivity.class, true, true);
String fileName = "valid_login_response.json";
mockWebServerTestRule.mockWebServer.enqueue(new MockResponse()
.setBody(RestServiceTestHelper.getStringFromFile(getContext(), fileName))
.setResponseCode(HttpURLConnection.HTTP_OK));
Intent intent = new Intent();
activityTestRule.launchActivity(intent);
loginViewModel.userName.postValue("Elon");
loginViewModel.password.postValue("Musk123");
loginViewModel.getAuthenticateTokenData();
mockWebServerTestRule.mockWebServer.takeRequest();
}
@Test
public void a_testDbEntryOnValidResponse() {
authentication = authenticationDao.getAuthInformation();
String issueTime = authentication.getIssueDateTime();
String expirationTime = authentication.getExpireDateTime();
String refreshToken = authentication.getRefreshToken();
Assert.assertEquals("Tue, 16 Apr 2019 10:39:20 GMT", issueTime);
Assert.assertEquals("Tue, 16 Apr 2019 10:54:20 GMT", expirationTime);
Assert.assertEquals("e2b4dfd7205587745aa3100af9a0b", refreshToken);
}
}
Ниже мой AppDatabase
класс:
@Database(entities = {Authentication.class, UserProfile.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE;
public static AppDatabase getAppDatabase(Context context) {
if (INSTANCE == null) {
INSTANCE =
Room.databaseBuilder(context,
AppDatabase.class,
"myapp-database")
.allowMainThreadQueries()
.build();
}
return INSTANCE;
}
public abstract AuthenticationDao authenticationDao();
public abstract UserProfileDao userProfileDao();
}
В чем может быть проблема?
Мой тестовый пример правильный?
Заранее спасибо.