PowerMock `thenReturn` не возвращает ожидаемые данные для смоделированного статического метода? - PullRequest
0 голосов
/ 14 декабря 2018

Я могу настроить свой тест, но он не проходит.Проблема в том, что проверенный метод все еще возвращает неверные данные.Это мой метод, который я хочу протестировать:

fun getTextByLanguage(list: List<TitleModel>) : String {
    val deviceLanguage = Locale.getDefault().language

    var default = ""
    for (item in list) {
        if (item.culture.contains(deviceLanguage, true)) return item.value
        if (item.culture.contains("en", true)) default = item.value
    }

    return default

}

И вот как я тестирую метод:

import junit.framework.TestCase.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.powermock.api.mockito.PowerMockito.*
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import java.util.Locale

@RunWith(PowerMockRunner::class)
@PrepareForTest(Locale::class)
class AppConfigUtilityByPowerMockTest {

    @Test
    fun `getTextByLanguage, test en`() {
        mockStatic(Locale::class.java)
        val mockedLocal = mock(Locale::class.java)
        `when`(Locale.getDefault()).thenReturn(mockedLocal)
        `when`(mockedLocal.language).thenReturn("en")

        val list = listOf(TitleModel("en-ca", "Home"), TitleModel("fr-ca", "HomeFr"))
        val actual = getTextByLanguage(list)

        assertEquals("Home", actual)
    }

    @Test
    fun `getTextByLanguage, test fr`() {
        mockStatic(Locale::class.java)
        val mockedLocal = mock(Locale::class.java)
        `when`(Locale.getDefault()).thenReturn(mockedLocal)
        `when`(mockedLocal.language).thenReturn("fr")

        val list = listOf(TitleModel("en-ca", "Home"), TitleModel("fr-ca", "HomeFr"))
        val actual = getTextByLanguage(list)

        assertEquals("HomeFr", actual)
    }
}

Первые тестовые случаибез проблем, но второй сбой.Это выход:

junit.framework.ComparisonFailure: expected:<Home[Fr]> but was:<Home[]>
Expected :HomeFr
Actual   :Home

1 Ответ

0 голосов
/ 14 декабря 2018

Один из способов ответить на вопрос - избавиться от Local класса из метода и делать вещи по-котлински.Итак, я изменил свой оригинальный метод следующим образом:

fun getTextByLanguage(list: List<TitleModel>, deviceLanguage: String = getDeviceLanguage()) : String {
    var default = ""
    for (item in list) {
        if (item.culture.contains(deviceLanguage, true)) return item.value
        if (item.culture.contains("en", true)) default = item.value
    }

    return default
}

fun getDeviceLanguage(): String {
    return Locale.getDefault().language
}

Теперь мой тестовый класс выглядит так:

import junit.framework.TestCase.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.PowerMockRunner
import java.util.Locale

@RunWith(PowerMockRunner::class)
@PrepareForTest(Locale::class)
class AppConfigUtilityByPowerMockTest {

    @Test
    fun `getTextByLanguage, test en`() {
        val list = listOf(TitleModel("en-ca", "Home"), TitleModel("fr-ca", "HomeFr"))
        val actual = getTextByLanguage(list, "en")

        assertEquals("Home", actual)
    }

    @Test
    fun `getTextByLanguage, test fr`() {
        val list = listOf(TitleModel("en-ca", "Home"), TitleModel("fr-ca", "HomeFr"))
        val actual = getTextByLanguage(list, "fr")

        assertEquals("HomeFr", actual)
    }
}

Хотя мой тест пройден, я все еще готовсм. ваши рекомендации и вниз, чтобы принять ваш ответ на мой вопрос.

...