Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android JUnit测试不将值作为参数发送到函数(Kotlin)_Android_Kotlin_Junit_Mockito_Viewmodel - Fatal编程技术网

Android JUnit测试不将值作为参数发送到函数(Kotlin)

Android JUnit测试不将值作为参数发送到函数(Kotlin),android,kotlin,junit,mockito,viewmodel,Android,Kotlin,Junit,Mockito,Viewmodel,我正在创建一个简单的junit测试来测试视图模型中的函数,但是第一个断言失败,因为我调用的函数返回null。当我调试我调用的函数时,它有空参数,这很奇怪,因为我传入了它们 我花了很多时间调试和搜索我为什么会有这个问题,但我没有找到任何可以解决我的问题或告诉我问题是什么的方法 @RunWith(MockitoJUnitRunner::class) class CurrencyUnitTest { @Rule @JvmField val rule = InstantTask

我正在创建一个简单的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"))
    }
}
@RunWith(MockitoJUnitRunner::class)
类CurrencyUnitTest{
@统治
@JvmField
val规则=InstantTaskExecutorRule()
@嘲弄
val currencyViewModel:currencyViewModel=mock(currencyViewModel::class.java)
@以前
趣味设置(){
initMocks(this)
val速率:HashMap=
hashMapOf(
“美元”对1.323234,
“英镑”对2.392394,
“澳元”对0.328429,
“KWR”至893.4833
)
val currencyRates=MutableLiveData()
val资源=资源(Status.SUCCESS,CurrencyRatesData(“CAD”,费率,0))
currencyRates.value=资源
`当`(currencyViewModel.currencyRatesData)。然后返回(currencyRates)
val baseCurrency=MutableLiveData()
baseCurrency.value=“CAD”
`当`(currencyViewModel.baseCurrency)。然后返回(baseCurrency)
}
@试验
有趣的calculateValueTest(){
//这失败了
资产质量(“0.36”,currencyViewModel.calculateValue(“AUD”,“1.11”))
}
}

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

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

您模拟的是您测试的类的依赖项,即您传递给其构造函数的对象

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