Skip to content

Commit

Permalink
Use proper mockito/kotlin for RootViewTest and JSPointerDispatcherTest (
Browse files Browse the repository at this point in the history
#48490)

Summary:
Pull Request resolved: #48490

## Changelog:
[Internal] -
This makes the `RootViewTest` and `JSPointerDispatcher` tests to use mockito-kotlin instead of the Java Mockito, which is the legacy of the conversion of the corresponding tests from Java.

Which:
* is the right thing to do, as we have more Kotlin-idiomatic tests
* helps with some Kotlin conversion with classes under test down the line, as Kotlin Mockito handles things like nullability etc properly

Reviewed By: javache

Differential Revision: D67824679

fbshipit-source-id: 055e9c7c4a33164ce6f4b9a5c47f16051d2a132f
  • Loading branch information
rshest authored and facebook-github-bot committed Jan 5, 2025
1 parent b867c01 commit e99b47c
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 37 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,21 +27,28 @@ import com.facebook.react.common.SystemClock
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests
import com.facebook.react.uimanager.DisplayMetricsHolder
import com.facebook.react.uimanager.UIManagerModule
import com.facebook.react.uimanager.events.Event
import com.facebook.react.uimanager.events.EventDispatcher
import com.facebook.react.uimanager.events.RCTEventEmitter
import com.facebook.react.uimanager.events.TouchEvent
import java.util.Date
import org.assertj.core.api.Assertions.*
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers
import org.mockito.MockedStatic
import org.mockito.Mockito
import org.mockito.Mockito.*
import org.mockito.Mockito.`when` as whenever
import org.mockito.Mockito.mockStatic
import org.mockito.kotlin.KArgumentCaptor
import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.eq
import org.mockito.kotlin.mock
import org.mockito.kotlin.reset
import org.mockito.kotlin.spy
import org.mockito.kotlin.times
import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.whenever
import org.robolectric.Robolectric
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
Expand All @@ -55,26 +62,38 @@ class RootViewTest {
private lateinit var arguments: MockedStatic<Arguments>
private lateinit var systemClock: MockedStatic<SystemClock>

private lateinit var downEventCaptor: KArgumentCaptor<TouchEvent>
private lateinit var downActionTouchesArgCaptor: KArgumentCaptor<WritableArray>

private lateinit var upEventCaptor: KArgumentCaptor<TouchEvent>
private lateinit var upActionTouchesArgCaptor: KArgumentCaptor<WritableArray>

@Before
fun setUp() {
ReactNativeFeatureFlagsForTests.setUp()

arguments = Mockito.mockStatic(Arguments::class.java)
arguments = mockStatic(Arguments::class.java)
arguments.`when`<WritableArray> { Arguments.createArray() }.thenAnswer { JavaOnlyArray() }
arguments.`when`<WritableMap> { Arguments.createMap() }.thenAnswer { JavaOnlyMap() }

val ts = SystemClock.uptimeMillis()
systemClock = Mockito.mockStatic(SystemClock::class.java)
systemClock = mockStatic(SystemClock::class.java)
systemClock.`when`<Long> { SystemClock.uptimeMillis() }.thenReturn(ts)

catalystInstanceMock = ReactTestHelper.createMockCatalystInstance()
reactContext = spy(BridgeReactContext(RuntimeEnvironment.getApplication()))
reactContext.initializeWithInstance(catalystInstanceMock)

DisplayMetricsHolder.initDisplayMetricsIfNotInitialized(reactContext)
val uiManagerModuleMock = mock(UIManagerModule::class.java)
val uiManagerModuleMock: UIManagerModule = mock()
whenever(catalystInstanceMock.getNativeModule(UIManagerModule::class.java))
.thenReturn(uiManagerModuleMock)

downEventCaptor = argumentCaptor()
downActionTouchesArgCaptor = argumentCaptor()

upEventCaptor = argumentCaptor()
upActionTouchesArgCaptor = argumentCaptor()
}

@After
Expand All @@ -85,11 +104,11 @@ class RootViewTest {

@Test
fun testTouchEmitter() {
val instanceManager = mock(ReactInstanceManager::class.java)
val instanceManager: ReactInstanceManager = mock()
whenever(instanceManager.currentReactContext).thenReturn(reactContext)
val uiManager = mock(UIManagerModule::class.java)
val eventDispatcher = mock(EventDispatcher::class.java)
val eventEmitterModuleMock = mock(RCTEventEmitter::class.java)
val uiManager: UIManagerModule = mock()
val eventDispatcher: EventDispatcher = mock()
val eventEmitterModuleMock: RCTEventEmitter = mock()
whenever(catalystInstanceMock.getNativeModule(UIManagerModule::class.java))
.thenReturn(uiManager)
whenever(uiManager.eventDispatcher).thenReturn(eventDispatcher)
Expand All @@ -106,19 +125,14 @@ class RootViewTest {
// Test ACTION_DOWN event
rootView.onTouchEvent(MotionEvent.obtain(100, ts, MotionEvent.ACTION_DOWN, 0f, 0f, 0))

val downEventCaptor = ArgumentCaptor.forClass(Event::class.java)
verify(eventDispatcher).dispatchEvent(downEventCaptor.capture())
verifyNoMoreInteractions(eventDispatcher)
downEventCaptor.value.dispatch(eventEmitterModuleMock)
val downActionTouchesArgCaptor = ArgumentCaptor.forClass(JavaOnlyArray::class.java)
downEventCaptor.firstValue.dispatch(eventEmitterModuleMock)
verify(eventEmitterModuleMock)
.receiveTouches(
ArgumentMatchers.eq("topTouchStart"),
downActionTouchesArgCaptor.capture(),
ArgumentMatchers.any(JavaOnlyArray::class.java))
.receiveTouches(eq("topTouchStart"), downActionTouchesArgCaptor.capture(), any())
verifyNoMoreInteractions(eventEmitterModuleMock)
assertThat(downActionTouchesArgCaptor.value.size()).isEqualTo(1)
assertThat(downActionTouchesArgCaptor.value.getMap(0))
assertThat(downActionTouchesArgCaptor.firstValue.size()).isEqualTo(1)
assertThat(downActionTouchesArgCaptor.firstValue.getMap(0))
.isEqualTo(
JavaOnlyMap.of(
"pageX",
Expand All @@ -140,22 +154,17 @@ class RootViewTest {

// Test ACTION_UP event
reset(eventEmitterModuleMock, eventDispatcher)
val upEventCaptor = ArgumentCaptor.forClass(Event::class.java)
val upActionTouchesArgCaptor = ArgumentCaptor.forClass(JavaOnlyArray::class.java)

rootView.onTouchEvent(MotionEvent.obtain(50, ts, MotionEvent.ACTION_UP, 0f, 0f, 0))

verify(eventDispatcher).dispatchEvent(upEventCaptor.capture())
verifyNoMoreInteractions(eventDispatcher)
upEventCaptor.value.dispatch(eventEmitterModuleMock)
upEventCaptor.firstValue.dispatch(eventEmitterModuleMock)
verify(eventEmitterModuleMock)
.receiveTouches(
ArgumentMatchers.eq("topTouchEnd"),
upActionTouchesArgCaptor.capture(),
ArgumentMatchers.any(WritableArray::class.java))
.receiveTouches(eq("topTouchEnd"), upActionTouchesArgCaptor.capture(), any())
verifyNoMoreInteractions(eventEmitterModuleMock)
assertThat(upActionTouchesArgCaptor.value.size()).isEqualTo(1)
assertThat(upActionTouchesArgCaptor.value.getMap(0))
assertThat(upActionTouchesArgCaptor.firstValue.size()).isEqualTo(1)
assertThat(upActionTouchesArgCaptor.firstValue.getMap(0))
.isEqualTo(
JavaOnlyMap.of(
"pageX",
Expand Down Expand Up @@ -186,7 +195,7 @@ class RootViewTest {

@Test
fun testRemountApplication() {
val instanceManager = mock(ReactInstanceManager::class.java)
val instanceManager: ReactInstanceManager = mock()
val rootView = ReactRootView(reactContext)
rootView.startReactApplication(instanceManager, "")
rootView.unmountReactApplication()
Expand All @@ -195,7 +204,7 @@ class RootViewTest {

@Test
fun testCheckForKeyboardEvents() {
val instanceManager = mock(ReactInstanceManager::class.java)
val instanceManager: ReactInstanceManager = mock()
val activity = Robolectric.buildActivity(Activity::class.java).create().get()
whenever(instanceManager.currentReactContext).thenReturn(reactContext)
val rootView: ReactRootView =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatcher
import org.mockito.Mockito.argThat
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
import org.mockito.kotlin.argThat
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment

Expand Down Expand Up @@ -75,7 +75,7 @@ class JSPointerDispatcherTest {
val ev =
createMotionEvent(
MotionEvent.ACTION_DOWN, childRect.centerX().toFloat(), childRect.centerY().toFloat())
val mockDispatcher: EventDispatcher = mock(EventDispatcher::class.java)
val mockDispatcher: EventDispatcher = mock()
pointerDispatcher.handleMotionEvent(ev, mockDispatcher, false)
verify(mockDispatcher).dispatchEvent(argThat(EventWithName(PointerEventHelper.POINTER_DOWN)))
}
Expand Down

0 comments on commit e99b47c

Please sign in to comment.