티스토리 뷰

1. Annotation
2. Mock Object
3. Method Stub
4. Spy Object
5. Assert
6. Verify

2. Mock Object

 

class UnitRepositoryImplTest {
    // Mock 객체 선언
    @MockK(relaxUnitFun = true)
    lateinit var unitDataSource: UnitDataSource
    
    lateinit var unitRepository: UnitRepository
    private val unitRequest = "unitId"
    
    @Before
    fun setup() {
        MockKAnnotations.init(this)
        unitRepository = UnitRepositoryImpl(unitServiceApi, unitDataSource, scheduler, unitMapper, errorTypeMapper)
    }
    
    @Test
    fun testGetUnit_success() {
        every { unitDataSource.getUnit(id.toString()) } returns expected
        
        val result = unitRepository.getUnit(id.toString(), clazz)
        
        Assert.assertEquals(result, expected)
        // Mock 객체의 행위 검증
        verify {unitDataSource.getUnit(id.toString()) }
    }
}

 

테스트를 수행할 때 실제 모듈을 사용하는 것이 하지않고 그것을 흉내내는 가짜 모듈을 사용하여 테스트의 효용성을 높이는데 사용하는 객체입니다.

mock 객체는 행위 호출의 결과를 설정할 수 있으며, 행위가 호출되었는지 검증(Behavior Verification)할 수 있습니다.

예를들어 인터페이스의 구현체 대신 인터페이스의 동작을 흉내내는 mock 객체를 생성하여 테스트에 사용합니다.

위의 예제코드는 unitRepository 테스트 소스코드 입니다.
unitRepository의 구성요소인 unitDataSource는 테스트 대상에서 제외됩니다.
unitDataSource 실제 객체 대신 mock 객체를 사용하여 실제 행위가 일어나지않게하고 unitDataSource의 행위가 호출 되었는지를 검증합니다.
이를 통하여 unitRepository에만 집중하여 테스트할 수 있습니다.

 

참고

Mock Object란 무엇인가?

android/architecture-samples/todoapp - Mock 사용 예제

댓글