반응형
- 이번엔 Room DB DAO를 통해 데이터의 저장 및 수정이 문제없이 작동하는지 테스트하는 코드를 작성해 본다.
@RunWith(AndroidJUnit4::class)
class MovieDaoTest {
@get:Rule
var instantTaskExecutorRule = InstantTaskExecutorRule()
private lateinit var dao: MovieDao
private lateinit var database: TMDBDatabase
- DAO Test 클래스를 하나 만들어서 동기적 테스트를 위해 InstantTaskExecutorRule()을 선언해 주고, DAO와 DB 초기화를 준비한다.
- 아래와 같은 DAO를 테스트해 보기로 했다.
@Dao
interface MovieDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun saveMovies(movies: List<MovieResult>)
@Query("DELETE FROM popular_movies")
suspend fun deleteAllMovies()
@Query("SELECT * FROM popular_movies")
suspend fun getMovies(): List<MovieResult>
}
@Entity(tableName = "popular_movies")
data class MovieResult(
@PrimaryKey
@SerializedName("id")
val id: Int,
@SerializedName("overview")
val overview: String?,
@SerializedName("poster_path")
val posterPath: String?,
@SerializedName("release_date")
val releaseDate: String?,
@SerializedName("title")
val title: String?
)
- 이제 테스트를 위한 Room DB 객체를 초기화해주어야 하는데, 메모리 상에 임시 DB 인스턴스를 생성하는 함수를 사용한다.
@Before
fun setUp() {
database = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(),
TMDBDatabase::class.java
).build()
dao = database.movieDao()
}
- Room.inMemoryDatabaseBuilder : 메모리 상에 임시 DB 인스턴스를 만들고, 가상으로 디스크에 데이터를 저장하는 역할을 한다.
- 이후에 메모리 DB를 깔끔하게 제거하는 코드를 작성한다. 테스트 로직 이후 작업이므로 @After 어노테이션을 사용한다.
@After
fun tearDown() {
database.close()
}
- 이제 실제로 DB 업데이트 및 삭제 등에 대한 테스트 코드 함수를 작성하면 된다.
@Test
fun saveMoviesTest() = runBlocking {
val movies = listOf(
MovieResult(1, "overview1", "path1", "2024-03-11", "first"),
MovieResult(2, "overview2", "path2", "2024-03-23", "second"),
MovieResult(3, "overview3", "path3", "2024-06-09", "third")
)
dao.saveMovies(movies)
val allMovies = dao.getMovies()
assertEquals(allMovies, movies)
}
@Test
fun deleteMoviesTest() = runBlocking {
dao.deleteAllMovies()
val allMovies = dao.getMovies()
assertEquals(allMovies, emptyList<MovieResult>())
}
- 실행 시 아래처럼 결과를 확인해 볼 수 있다.
- 참고로 Room DB 같은 안드로이드 프레임 워크 테스트의 경우에는 /androidTest 폴더 하위에 작성되어야 한다.
- RoomDatabase, Context, SQLite, LiveData, Flow 등 Android 전용 컴포넌트를 사용하므로 JVM 환경(test/)에서 단독으로 실행할 수 없기 때문이다.
반응형