【问题标题】:How to mock methods of an activity annotated with @AndroidEntryPoint如何模拟使用@AndroidEntryPoint 注释的活动的方法
【发布时间】:2021-09-20 16:02:01
【问题描述】:

我想创建一个带有注解@AndroidEntryPoint 的Activity 的模拟对象。在那次模拟之后,它的方法就像 whenever(activity.getAnalytics()).thenReturn(mockOfAnalytics)

但它不适用于@AndroidEntryPoint 注释的活动,当我删除此注释时它可以工作 - build.tool 4.2.2

@RunWith(PowerMockRunner::class)
@PrepareForTest(Html::class)
class CallShopViewModelTest {

...

    @Mock
    private lateinit var storefrontAnalytics: StorefrontAnalytics

    @Mock
    private lateinit var storefrontDelegate: StorefrontActivity.StorefrontDelegate

...

    @Test
      fun setShopObject() {
        val mock = Mockito.mock(ShopMenuActivity::class.java)
        whenever(mock.storefrontAnalytics).thenReturn(storefrontAnalytics)
        whenever(mock.storefrontDelegate).thenReturn(storefrontDelegate)
        whenever(mock.getString(ArgumentMatchers.anyInt(), 
               ArgumentMatchers.anyString())).thenReturn("test")

        objectUnderTest = CallShopViewModel(mock)
        objectUnderTest.setShop(Shop().apply {
            isAcquired = false
            shopId = 100
            twilioPhone = "123"
        })

        Assert.assertFalse(objectUnderTest.mAcquired.get())
        Assert.assertTrue(objectUnderTest.twilioFormattedText.get() != "")
    }
}

活动

@AndroidEntryPoint
class ShopMenuActivity : StorefrontActivity {

    ....

    val storefrontAnalytics: StorefrontAnalytics
        get() = app.storefrontAnalytics

    val storefrontDelegates: StorefrontDelegates
        get() = app.storefrontDelegates

}

那么我怎样才能模拟这个活动并使用它的方法呢? 谢谢!

【问题讨论】:

    标签: android testing mockito dagger-hilt


    【解决方案1】:

    你最好注入storefrontAnalytics: StorefrontAnalyticsval storefrontDelegates: StorefrontDelegates。 Hilt 插件正在将您的 @AndroidEntryPoint 重写为不同的装饰器,这可能是您得到不同结果的原因。

    如果您想对视图模型进行单元测试,则不应引入托管它的活动。直接向视图模型提供模拟依赖项。另外,为什么要向视图模型构造函数提供活动?这会让你的单元测试非常痛苦。

    类似这样的:

    @RunWith(PowerMockRunner::class)
    @PrepareForTest(Html::class)
    class CallShopViewModelTest {
    
    ...
    
        @Mock
        private lateinit var storefrontAnalytics: StorefrontAnalytics
    
        @Mock
        private lateinit var storefrontDelegate: StorefrontActivity.StorefrontDelegate
    
    ...
    
        @Test
          fun setShopObject() {
            val mockStorefrontAnalytics : ... = mock()
            val mockStorefrontDelegate : ... = mock()
            whenever(mockStorefrontAnalytics).thenReturn(storefrontAnalytics)
            whenever(mockStorefrontDelegate).thenReturn(storefrontDelegate)
    
            objectUnderTest = CallShopViewModel(mockmockStorefrontAnalytics, mockStorefrontDelegate)
            objectUnderTest.setShop(Shop().apply {
                isAcquired = false
                shopId = 100
                twilioPhone = "123"
            })
    
            Assert.assertFalse(objectUnderTest.mAcquired.get())
            Assert.assertTrue(objectUnderTest.twilioFormattedText.get() != "")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 2019-11-27
      • 2018-09-13
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多