11package github.com.st235.expandablebottombar
22
33import android.content.Context
4- import android.content.res.ColorStateList
5- import android.graphics.drawable.ColorStateListDrawable
64import android.view.View
75import androidx.test.core.app.ApplicationProvider
8- import com.nhaarman.mockitokotlin2.anyOrNull
9- import github.com.st235.lib_expandablebottombar.test.R
10- import com.nhaarman.mockitokotlin2.mock
11- import com.nhaarman.mockitokotlin2.whenever
126import github.com.st235.lib_expandablebottombar.ExpandableBottomBar
137import github.com.st235.lib_expandablebottombar.MenuItem
148import github.com.st235.lib_expandablebottombar.MenuItemDescriptor
159import github.com.st235.lib_expandablebottombar.MenuItemFactory
1610import github.com.st235.lib_expandablebottombar.components.MenuItemView
17- import github.com.st235.lib_expandablebottombar.utils.DrawableHelper
11+ import github.com.st235.lib_expandablebottombar.test.R
1812import github.com.st235.lib_expandablebottombar.utils.StyleController
1913import org.junit.Before
2014import org.junit.Test
2115import org.junit.runner.RunWith
22- import org.mockito.Mockito.*
16+ import org.mockito.kotlin.anyOrNull
17+ import org.mockito.kotlin.eq
18+ import org.mockito.kotlin.mock
19+ import org.mockito.kotlin.times
20+ import org.mockito.kotlin.verify
21+ import org.mockito.kotlin.whenever
2322import org.robolectric.RobolectricTestRunner
24- import java.lang.reflect.Field
25- import java.lang.reflect.Modifier
2623
2724@RunWith(RobolectricTestRunner ::class )
2825class MenuItemFactoryTest {
@@ -31,8 +28,6 @@ class MenuItemFactoryTest {
3128 private val rootView = mock<ExpandableBottomBar >()
3229 private val styleController = mock<StyleController >()
3330 private val onItemClick = mock< (MenuItem , View ) -> Unit > ()
34- private val colorStateList = mock<ColorStateList >()
35- private val drawableHelper = mockObject(DrawableHelper ::class .java)
3631
3732 private val itemVerticalPadding: Int = 54
3833 private val itemHorizontalPadding: Int = 61
@@ -80,7 +75,6 @@ class MenuItemFactoryTest {
8075 @Before
8176 fun setUp () {
8277 whenever(rootView.context).thenReturn(ApplicationProvider .getApplicationContext())
83- doAnswer{ colorStateList }.whenever(drawableHelper).createSelectedUnselectedStateList(anyInt(), anyInt())
8478 }
8579
8680 @Test
@@ -89,8 +83,8 @@ class MenuItemFactoryTest {
8983
9084 verify(itemView, times(1 )).id = menuItemDescriptorWithoutNotificationInfo.itemId
9185 verify(itemView, times(1 )).setPadding(itemHorizontalPadding, itemVerticalPadding, itemHorizontalPadding, itemVerticalPadding)
92- verify(itemView, times(1 )).setIcon(menuItemDescriptorWithoutNotificationInfo.iconId, colorStateList )
93- verify(itemView, times(1 )).setText(menuItemDescriptorWithoutNotificationInfo.text, colorStateList )
86+ verify(itemView, times(1 )).setIcon(eq( menuItemDescriptorWithoutNotificationInfo.iconId), anyOrNull() )
87+ verify(itemView, times(1 )).setText(eq( menuItemDescriptorWithoutNotificationInfo.text), anyOrNull() )
9488 verify(itemView, times(1 )).notificationBadgeBackgroundColor = globalNotificationBadgeColor
9589 verify(itemView, times(1 )).notificationBadgeTextColor = globalNotificationBadgeTextColor
9690 }
@@ -101,41 +95,9 @@ class MenuItemFactoryTest {
10195
10296 verify(itemView, times(1 )).id = menuItemDescriptorWithNotificationInfo.itemId
10397 verify(itemView, times(1 )).setPadding(itemHorizontalPadding, itemVerticalPadding, itemHorizontalPadding, itemVerticalPadding)
104- verify(itemView, times(1 )).setIcon(menuItemDescriptorWithNotificationInfo.iconId, colorStateList )
105- verify(itemView, times(1 )).setText(menuItemDescriptorWithNotificationInfo.text, colorStateList )
98+ verify(itemView, times(1 )).setIcon(eq( menuItemDescriptorWithNotificationInfo.iconId), anyOrNull() )
99+ verify(itemView, times(1 )).setText(eq( menuItemDescriptorWithNotificationInfo.text), anyOrNull() )
106100 verify(itemView, times(1 )).notificationBadgeBackgroundColor = menuItemDescriptorWithNotificationInfo.badgeBackgroundColor!!
107101 verify(itemView, times(1 )).notificationBadgeTextColor = menuItemDescriptorWithNotificationInfo.badgeTextColor!!
108102 }
109-
110- private fun <T > mockObject (clazz : Class <T >): T {
111- val constructor = clazz.declaredConstructors.find { it.parameterCount == 0 }
112- ? : throw InstantiationException (" class ${clazz.canonicalName} has no empty constructor, " +
113- " is it really a Kotlin \" object\" ?" )
114-
115- constructor .isAccessible = true
116-
117- val mockedInstance = spy(constructor .newInstance() as T )
118-
119- return replaceObjectInstance(clazz, mockedInstance)
120- }
121-
122- private fun <T > replaceObjectInstance (clazz : Class <T >, newInstance : T ): T {
123-
124- if (! clazz.declaredFields.any {
125- it.name == " INSTANCE" && it.type == clazz && Modifier .isStatic(it.modifiers)
126- }) {
127- throw InstantiationException (" clazz ${clazz.canonicalName} does not have a static " +
128- " INSTANCE field, is it really a Kotlin \" object\" ?" )
129- }
130-
131- val instanceField = clazz.getDeclaredField(" INSTANCE" )
132- val modifiersField = Field ::class .java.getDeclaredField(" modifiers" )
133- modifiersField.isAccessible = true
134- modifiersField.setInt(instanceField, instanceField.modifiers and Modifier .FINAL .inv ())
135-
136- instanceField.isAccessible = true
137- val originalInstance = instanceField.get(null ) as T
138- instanceField.set(null , newInstance)
139- return newInstance
140- }
141103}
0 commit comments