意外的断言行为

时间:2018-06-15 13:34:31

标签: android unit-testing kotlin

我是Kotlin Android的新手,所以在编写测试时,这些断言意外传递:

import org.junit.Test

assert("x".equals("y"))
assert("x" == "y")

但这确实失败了:

import junit.framework.Assert.assertEquals
assertEquals("x", "y")

所以我查看了字符串结构比较。

然后发现这也通过了:

assert(false)

看起来org.junit.Test默认出现在新项目中:

testImplementation 'junit:junit:4.12'

所以现在我想知道要同步的正确testImplementation包是什么。我使用了错误的吗?

3 个答案:

答案 0 :(得分:3)

您正在使用仅在启用平台断言时启用的kotlin.assert。您所说的检查应该导致错误,从不执行。

使用-ea(启用断言)JVM参数运行它或使用assertEquals这是通常的测试框架名称,因为assert是java中的关键字。

答案 1 :(得分:3)

来自asserthttps://kotlinlang.org/api/latest/jvm/stdlib/kotlin/assert.html)的文档:

  

如果值为false且运行时断言,则抛出AssertionError   已使用-ea JVM选项在JVM上启用。

您应该使用来自Assert.assertTrue的{​​{1}}或Assert.assertEquals代替。

答案 2 :(得分:-3)

查找内部文档,assertEquals没有两个String参数可供比较。它只接收通用对象:

  

assertEquals(java.lang.Object expected,java.lang.Object actual)=>   断言两个对象是相等的。

字符串应使用.equals(String)方法进行比较,因为对象具有不同的地址内存访问权限,因此尽管它们具有相同的内容,但它们是不同的。

::编辑::

要使用相同的对象类型的字符串,您应该使用.clone()方法。它从原始对象返回相同的内容和相同的引用。