본문

Unit Test 기본 실습

도입

이번 포스팅에서는 Mockito를 이용해 지난 시간 정리했던 mock, spy, stub 에 대해 실습할 예정이다.

 

Unit Test 개념 및 Lifecycle

도입 이번 포스팅에서는 Unit Test에 대해 정리할 예정이다. 개념과 목적 Unit test Unit Test의 목적은 소스 코드의 유닛을 독립적으로, 정상적으로 동작하는지 확인하기 위함이다. 테스트할 Unit을 제

heepie.me


실습

아래 클래스는 실습을 위해 사전에 정의한 의존성 및 클래스 이다.

dependencies {
    testImplementation "com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0"
    testImplementation "org.mockito:mockito-inline:3.6.28"
}
data class RoomInfo(
    val roomId: Int = DEFAULT_INT,
    val messageId: Int = DEFAULT_INT /* DEFAULT_INT is -1 */
)

class SharedViewModel(
    private val roomInfo: RoomInfo
) : ViewModel() {
    var roomId: Int = DEFAULT_INT /* DEFAULT_INT is -1 */

    fun invokeIfComebackFromMessageList(block: () -> Unit) {
        if (roomInfo.roomId != DEFAULT_INT) {
            print("Test")
            block.invoke()
        }
    }
}

Mock & Stub

Mocking을 했을 때 stubbing하지 않은 값의 경우, 다른 결과를 반환해 Test에 실패한다.

@Test
fun testMock() {
    val stubInt = 10
    // Create mockObject
    val mockRoomInfo = mock<RoomInfo> {
        // Stubbing mock
        on { roomId } doReturn stubInt
    }

    // Check stubbing
    assertEquals(stubInt, mockRoomInfo.roomId)
    assertEquals(ConstUtil.DEFAULT_INT, mockRoomInfo.messageId)
}
// Result
java.lang.AssertionError: 
    Expected :-1
    Actual   :0

Spy & Stub

Spy를 사용했을 때 stubbing하지 않은 값의 경우, 실제 class를 호출하기 때문에 Test에 성공한다.

@Test
fun testSpy() {
    val stubInt = 10
    // Create spy
    val mockRoomInfo = spy<RoomInfo> {
        // Stubbing mock
        on { roomId } doReturn stubInt
    }

    // Create spy by real class
    val spyRoomInfo2 = spy(RoomInfo(stubInt, stubInt)) {
    // stubbing mock
        on { roomId } doReturn stubInt
    }


    // Check stubbing
    assertEquals(stubInt, mockRoomInfo.roomId)
    assertEquals(ConstUtil.DEFAULT_INT, mockRoomInfo.messageId)    
}

// Result
Test success!

ShareViewModel Test

테스트할 ViewModel을 생성하고 의존성이 있는 class를 mocking해 전달한다.
stubbing을 통해 값을 설정해 ViewModel을 테스트한다.

@Test
fun testMock() {
    val expectedInvoke: (() -> Unit) = mock()
    val stubInt = 10
    // Create mockObject
    val mockRoomInfo = mock<RoomInfo> {
        // Stubbing mock
        on { roomId } doReturn stubInt
    }

    // Check method
    val viewModel = SharedViewModel(mockRoomInfo)
    viewModel.invokeIfComebackFromMessageList(expectedInvoke)
    verify(expectedInvoke).invoke()
}

 

#mock #stub #spy #testcode

'컴퓨터 > 이론: 안드로이드' 카테고리의 다른 글

AndroidJUnitRunner  (0) 2020.12.25
Unit Test 개념 및 Lifecycle  (0) 2020.12.19
DataStore 개념 및 실습  (0) 2020.12.13
Gradle implementation  (0) 2020.04.02
generated Folder 란?  (0) 2020.03.16

공유

댓글