Development/Android

[Android Test] Room DB 테스트 코드 작성하기

SeungYong.Lee 2025. 4. 25. 21:19
반응형

- 이번엔 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/)에서 단독으로 실행할 수 없기 때문이다.

 

 

반응형