首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Kotlin数据类的Json解析器正确地返回json数据,但是为什么解析器(MockK)的单元测试失败?

使用Kotlin数据类的Json解析器正确地返回json数据,但是为什么解析器(MockK)的单元测试失败?
EN

Stack Overflow用户
提问于 2021-02-21 09:44:36
回答 1查看 852关注 0票数 4

我有一个非常简单的JSON解析器,它使用Kotlin数据类,并且工作非常完美。但是,当我尝试单元测试解析器方法(MockK)时,断言失败,因为模型对象返回空值。我对Kotlin和MockK都是新手,所以请帮我找出我的错误所在。

用于此目的的所有文件/类如下:

data.json {"name":"john","age":22,"subject":"engineering"}

parser.kt

代码语言:javascript
运行
复制
interface Parser {
    fun parseJson(jsonObject: JSONObject)
}

Student.kt

代码语言:javascript
运行
复制
data class Student(
    var name: String? = null,
    var age: Int? = null,
    var subject: String? = null
) : Parser {

    override fun parseJson(jsonObject: JSONObject) {
        jsonObject?.let {
            name = it.getString("name")
            age = it.getInt("age")
            subject = it.getString("subject")
        }
    }
}

MainActivity -一种从data.json读取、解析它和记录结果的简单方法

代码语言:javascript
运行
复制
private fun readJson() {
    val inputStream = (assets.open("data.json"))
    val buffer = ByteArray(inputStream.available())
    inputStream.read(buffer)
    inputStream.close()
    val jsonData = JSONObject(String(buffer, StandardCharsets.UTF_8))

    val student = Student()
    student.parseJson(jsonData)
    Log.d("TAG", student.name + " " + student.age + " " + student.subject) // RETURNS CORRECT DATA
}

StudentTest.kt

代码语言:javascript
运行
复制
class StudentTest {
    private lateinit var student: Student

    @Before
    fun setUp() {
        MockKAnnotations.init(this, relaxed = true)
        student = Student()
    }

    @Test
    fun `test parser`() {
        student.parseJson(JSONObject(DATA))
        assertEquals("mary", student.name) // ASSERTION FAILS - student.name returns NULL
    }

    private companion object {
        const val DATA = "{\"name\":\"mary\",\"age\":21,\"subject\":\"history\"}"
    }
}

任何帮助都将不胜感激。先谢谢大家。

EN

回答 1

Stack Overflow用户

发布于 2021-07-19 12:58:06

看来您实际上不需要对此测试进行嘲弄。除非你问题中的代码不完整。

简化示例:

代码语言:javascript
运行
复制
@Test
fun `test parser`() {
    val student = Student()
    student.parseJson(JSONObject("{\"name\":\"mary\",\"age\":21,\"subject\":\"history\"}"))
    assertEquals("mary", student.name)
}

这是在名字上断言的,就像你的例子一样。创建一个Student实例,然后使用不可序列化的字符串调用parseJson。这个断言是成功的。

如果这不能回答你的问题,请重新措辞和/或添加一个更好的例子。:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66300973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档