如何测试包装在`runOnUiThread`中的代码?
我有一个函数调用runOnUiThread
如下
fun myFunction(myObject: MyClass, view: MyView) { // Do something view.getActivity().runOnUiThread { myObject.myObjectFunction() } }
我想单元测试myFunction
以确保myObject
已经调用myObjectFunction
。 但是鉴于它是在runOnUiThread
包装的,我无法得到它。
我怎么能单元测试,以确保runOnUiThread
内的runOnUiThread
被调用?
管理找到使用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() }