Тест JUnit не отправляет значения в качестве параметров для функции (Kotlin)

Я создаю простой тест 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"))
    }
}
1
0
655
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Мокированные классы на самом деле не будут называться. Если вы хотите протестировать свой метод currencyViewModel.calculateValue(), создайте реальный объект этого класса и смоделируйте возможные аргументы конструктора.

Чтобы добавить к тому, что сказал Бен: класс, который вы хотите протестировать, должен быть реальным объектом, а не макетом. Макет «ничего не делает» по умолчанию и делает только то, что вы делаете, чтобы сообщить вам, поэтому тестировать его не имеет никакого смысла.

То, что вы издеваетесь, - это зависимости тестируемого вами класса, то есть объекты, которые вы передаете его конструктору.

Короче говоря: если вы хотите протестировать CurrencyViewModel, создайте его объект, а не мокайте его.

Другие вопросы по теме