kokoichi206 / android-app

0 stars 0 forks source link

navOption がある時に、mockK のテストができない #2

Open kokoichi206 opened 2 years ago

kokoichi206 commented 2 years ago

テストしたいコード

navController.navigate(
    Screen.MemberDetailScreen.route
            + "/${Constants.NAV_PARAM_MEMBER_PROPS}=${getJsonFromMember(member)}"
) {
    launchSingleTop = true
}

テストコード

@ExperimentalCoroutinesApi
@HiltAndroidTest
@UninstallModules(AppModule::class)
class MemberListScreenTest {

    @get:Rule(order = 0)
    val hiltRule = HiltAndroidRule(this)

    @get:Rule(order = 1)
    val composeRule = createAndroidComposeRule<MainActivity>()

    @RelaxedMockK
    lateinit var navController: NavController

    private val testDispatcher = TestCoroutineDispatcher()

    @Before
    fun setUp() {

        hiltRule.inject()
        MockKAnnotations.init(this)

        composeRule.setContent {
            MemberListScreen(
                navController = navController,
            )
        }
    }

    @Test
    fun memberImage_canTapOnlyOnce() {

        // Members are defined in data/remote/MockSakamichiApi
        composeRule.onNodeWithContentDescription("image of 秋元 真夏").assertIsDisplayed()

        composeRule.onNodeWithContentDescription("image of 秋元 真夏").performClick()
        composeRule.onNodeWithContentDescription("image of 秋元 真夏").performClick()
        val memberJson = StringBuilder()
            .append("{\"birthday\":\"1993年8月20日\",")
            .append("\"blogUrl\":\"https:%2F%2Fblog.nogizaka46.com%2Fmanatsu.akimoto\",")
            .append("\"bloodType\":\"B型\",\"generation\":\"1期生\",\"group\":\"乃木坂\",\"height\":\"154cm\",")
            .append("\"imgUrl\":\"https:%2F%2Fkokoichi0206.mydns.jp%2Fimgs%2Fnogi%2Fakimotomanatsu.jpeg\",")
            .append("\"name\":\"秋元 真夏\"}")
            .toString()
        val member = Member(
            name = "秋元 真夏",
            birthday = "1993年8月20日",
            height = "154cm",
            bloodType = "B型",
            generation = "1期生",
            blogUrl = "https://blog.nogizaka46.com/manatsu.akimoto",
            imgUrl = "https://kokoichi0206.mydns.jp/imgs/nogi/akimotomanatsu.jpeg",
            group = "乃木坂",
        )

        verify {
            navController.
            navController.navigate(
                // ここでの navOption の渡し方わからん
                Screen.MemberDetailScreen.route
                        + "/${Constants.NAV_PARAM_MEMBER_PROPS}=${getJsonFromMember(member)}") {launchSingleTop = true}
        }
}

上記でのエラー

java.lang.AssertionError: Verification failed: call 1 of 1: 
NavController(navController#1).navigate(eq(member_detail_screen/memberJson=
{"birthday":"1993年8月20
日","blogUrl":"https:%2F%2Fblog.nogizaka46.com%2Fmanatsu.akimoto","bloodType":"B
型","generation":"1期生","group":"乃木
坂","height":"154cm","imgUrl":"https:%2F%2Fkokoichi0206.mydns.jp%2Fimgs%2Fnogi%2F
akimotomanatsu.jpeg","name":"秋元 真夏"}), eq(lambda {}))). No matching calls found.

Calls to same method:
1) NavController(navController#1).navigate(member_detail_screen/memberJson=
{"birthday":"1993年8月20
日","blogUrl":"https:%2F%2Fblog.nogizaka46.com%2Fmanatsu.akimoto","bloodType":"B
型","generation":"1期生","group":"乃木
坂","height":"154cm","imgUrl":"https:%2F%2Fkokoichi0206.mydns.jp%2Fimgs%2Fnogi%2F
akimotomanatsu.jpeg","name":"秋元 真夏"}, lambda {})
2) NavController(navController#1).navigate(member_detail_screen/memberJson=
{"birthday":"1993年8月20
日","blogUrl":"https:%2F%2Fblog.nogizaka46.com%2Fmanatsu.akimoto","bloodType":"B
型","generation":"1期生","group":"乃木
坂","height":"154cm","imgUrl":"https:%2F%2Fkokoichi0206.mydns.jp%2Fimgs%2Fnogi%2F
akimotomanatsu.jpeg","name":"秋元 真夏"}, lambda {})
kokoichi206 commented 2 years ago

navOptions を使わない方針で、(一応)回避することはできる

今回みたいに、ダブルタップを防止したいのであれば、以下のようにする(navigation Top にいる時に限る)

navController.navigateUp()
navController.navigate(
    Screen.MemberDetailScreen.route
            + "/${Constants.NAV_PARAM_MEMBER_PROPS}=${getJsonFromMember(member)}"
) 

テスト

verify {
    navController.navigateUp()
    navController.navigate(
        Screen.MemberDetailScreen.route
                + "/${Constants.NAV_PARAM_MEMBER_PROPS}=${getJsonFromMember(member)}")

}
kokoichi206 commented 2 years ago

https://stackoverflow.com/questions/63653728/mockk-verify-lambda-was-passed-in-mock

https://coderoad.ru/63653728/mockk-verify-lambda-%D0%B1%D1%8B%D0%BB-%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D0%BD-%D0%B2-mock