【问题标题】:JUnit test not sending values as parameters to function (Kotlin)JUnit 测试不将值作为参数发送给函数(Kotlin)
【发布时间】:2019-04-30 18:46:44
【问题描述】:

我正在创建一个简单的 junit 测试来测试我的视图模型中的一个函数,但第一个断言失败,因为我调用的函数返回 null。当我调试我调用的函数时,我调用的函数有空参数,这很奇怪,因为我将它们传入。

我已经花时间调试和寻找我遇到这个问题的原因,但我没有发现任何东西可以解决我的问题或告诉我问题是什么。

@RunWith(MockitoJUnitRunner::class)
class CurrencyUnitTest {

    @Rule
    @JvmField
    val rule = InstantTaskExecutorRule()

    @Mock
    val currencyViewModel : CurrencyViewModel = mock(CurrencyViewModel::class.java)

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)

        val rates: HashMap<String, Double> =
                hashMapOf(
                    "USD" to 1.323234,
                    "GBP" to 2.392394,
                    "AUD" to 0.328429,
                    "KWR" to 893.4833
                )

        val currencyRates = MutableLiveData<Resource<CurrencyRatesData?>>()
        val resource = Resource<CurrencyRatesData?>(Status.SUCCESS, CurrencyRatesData("CAD", rates, 0))
        currencyRates.value = resource

        `when`(currencyViewModel.currencyRatesData).thenReturn(currencyRates)

        val baseCurrency = MutableLiveData<String>()
        baseCurrency.value = "CAD"

        `when`(currencyViewModel.baseCurrency).thenReturn(baseCurrency)
    }

    @Test
    fun calculateValueTest() {
        // this fails
        assertEquals("0.36", currencyViewModel.calculateValue("AUD", "1.11"))
    }
}

【问题讨论】:

    标签: android kotlin junit mockito viewmodel


    【解决方案1】:

    模拟类不会真正被调用。如果您想测试您的 currencyViewModel.calculateValue() 方法,请创建该类的真实对象并模拟可能的构造函数参数。

    【讨论】:

      【解决方案2】:

      补充 Ben 所说的:您要测试的类必须是真实对象,而不是模拟对象。默认情况下,模拟“什么都不做”,只做你告诉你的事情,所以测试它没有任何意义。

      你模拟的是你测试的类的依赖关系,即你传递给它的构造函数的对象。

      简而言之:如果您想测试CurrencyViewModel,请创建它的对象而不是模拟它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 2021-06-04
        • 2011-11-22
        • 1970-01-01
        • 2016-06-16
        相关资源
        最近更新 更多