2016-08-08 2 views
4

나는 내가 myObject을 보장하기 위해 유닛 테스트 myFunction하려는 runOnUiThread `runOnUiThread`에 래핑 된 테스트 코드를 어떻게 처리할까요?

fun myFunction(myObject: MyClass, view: MyView) { 
    // Do something 
    view.getActivity().runOnUiThread { 
     myObject.myObjectFunction() 
    } 
} 

다음과 같이 myObjectFunction 전화가 호출하는 기능을 가지고있다. 그러나 그것이 runOnUiThread에 감싸는 것을 감안할 때, 나는 그것에 도착할 수 없다.

runOnUiThread의 코드가 호출되도록 단위 테스트를 수행하려면 어떻게해야합니까?

답변

3

ArgumentCaptor을 사용하여 테스트를 수행하는 방법을 찾아 관리하십시오. runOnUiThread() 함수에서 Runnable을 캡처 한 다음 실행을 실행하십시오. runOnUiArgCaptor.value.run()

import com.nhaarman.mockito_kotlin.argumentCaptor 
import com.nhaarman.mockito_kotlin.verify 
import com.nhaarman.mockito_kotlin.whenever 
import org.junit.Before 
import org.junit.Test 
import org.mockito.Mock 

@Mock lateinit var activity: Activity 
@Mock lateinit var view: MyView 
@Mock lateinit var myObject: MyObject 

@Before 
fun setUp() { 
    MockitoAnnotations.initMocks(this) 
} 

@Test 
fun my_test_function() { 
    whenever(view.getActivity()).thenReturn(activity) 

    val runOnUiArgCaptor = argumentCaptor<Runnable>() 
    val myTestObject = TestObject() 

    myTestObject.myFunction(myObject, view) 
    verify(activity).runOnUiThread(runOnUiArgCaptor.capture()) 
    runOnUiArgCaptor.value.run() 

    verify(myObject).myObjectFunction() 

}