【问题标题】:How to test @Model data classes from Jetpack Compose?如何从 Jetpack Compose 测试 @Model 数据类?
【发布时间】:2020-01-28 04:06:51
【问题描述】:

我正在尝试测试我的 UI 层和我的域层之间的映射器功能。

但是我得到了 java.lang.IllegalStateException: Not in a frame 的异常抛出

如果我将 UIModel 更改为 val 而不是 var,此异常就会消失,但对于 Jetpack Compose 提供的模型更新来说,它是无用的。

有没有办法测试这种类型的映射器?

import androidx.compose.Model
import org.junit.Assert.assertEquals
import org.junit.Test

class DataModelMapperTest {

    @Test
    fun `data model to ui model`() {
        val model = DataModel(5)
        val uiModel = UIModel(5)

        assertEquals(uiModel, model.toUIModel())
    }

    @Test
    fun `ui model to data model`() {
        val model = DataModel(5)
        val uiModel = UIModel(5)

        assertEquals(model, uiModel.toDataModel())
    }

}

@Model
data class UIModel(var value: Int)

data class DataModel(val value: Int)

fun DataModel.toUIModel(): UIModel = UIModel(this.value)

fun UIModel.toDataModel(): DataModel = DataModel(this.value)

【问题讨论】:

  • 看来@Model 的注释处理器仍在被调用,并且正在生成一些不能很好地与单元测试配合使用的东西。如果您切换到仪器测试,我相信您可以利用编写 Compose 测试的秘诀。可能最终也会有单元测试解决方案,但我认为我们距离获得稳定的 Compose 版本还有很长的路要走,所以暂时会有这些限制。
  • 小笨蛋:它不是一个注解处理器,它是一个编译器插件。 Compose 不使用任何注释处理器。

标签: android testing kotlin android-jetpack-compose


【解决方案1】:

我遇到了同样的问题。这是我的想法:我必须在调用setContent() 之内(或之后)初始化带有@Model 注释的模型对象。

Google 的JetNews 示例带有ComposeTestRule.launchJetNewsApp() 函数,该函数由JetnewsUiTest.setUp() 调用。他们的测试类充分利用了 androidx.ui:ui-test 的东西,包括createComposeRule()。你可能想看看它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2022-06-15
    • 2022-11-10
    • 1970-01-01
    • 2023-02-11
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多