Я создаю простой тест 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"))
}
}
Мокированные классы на самом деле не будут называться. Если вы хотите протестировать свой метод currencyViewModel.calculateValue(), создайте реальный объект этого класса и смоделируйте возможные аргументы конструктора.
Чтобы добавить к тому, что сказал Бен: класс, который вы хотите протестировать, должен быть реальным объектом, а не макетом. Макет «ничего не делает» по умолчанию и делает только то, что вы делаете, чтобы сообщить вам, поэтому тестировать его не имеет никакого смысла.
То, что вы издеваетесь, - это зависимости тестируемого вами класса, то есть объекты, которые вы передаете его конструктору.
Короче говоря: если вы хотите протестировать CurrencyViewModel, создайте его объект, а не мокайте его.