我想在测试代码的同一文件中创建自定义断言。
我所做的是
fun String?.isValidJson(): Boolean {
try {
JSONObject(this)
} catch (ex: JSONException) {
// e.g. in case JSONArray is valid as well...
try {
JSONArray(this)
} catch (ex1: JSONException) {
return false
}
}
return true
}
@Test
fun `Check body is valid json`() {
// ...
assertThat(entity.body.isValidJson()).isTrue()
}
但是,它看起来并不专业,我想自定义自己的断言:
assertThat(entity.body).isValidJson()
我在IntelliJ的帮助下尝试了很多方法,但是都失败了。 任何人都可以创建这个吗?
这是IntelliJ自动生成的功能,无法正常工作:
private fun <SELF, ACTUAL> AbstractCharSequenceAssert<SELF, ACTUAL>.isValidJson() {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
答案 0 :(得分:1)
如here(AssertJ官方文档)所述,您可以使用类似的方法获得所需的结果
import JsonAssert.Companion.assertThatJson
import org.assertj.core.api.AbstractAssert
import org.junit.Test
fun String?.isValidJson(): Boolean {
// return this == "valid"
try {
JSONObject(this)
} catch (ex: JSONException) {
// e.g. in case JSONArray is valid as well...
try {
JSONArray(this)
} catch (ex1: JSONException) {
return false
}
}
return true
}
class JsonAssert(value: String) : AbstractAssert<JsonAssert, String>(value, JsonAssert::class.java) {
fun isValid() : JsonAssert {
if(!actual.isValidJson()) {
failWithMessage("Actual value <%s> is not a valid JSON", actual);
}
return this
}
companion object {
fun assertThatJson(value: String) : JsonAssert {
return JsonAssert(value)
}
}
}
class ScratchTest {
@Test
fun `Check body is valid json`() {
val value = "valid"
assertThatJson(value).isValid()
}
}
我认为您对fun String?.isValidJson(): Boolean
的实现是可以的,并在我的自定义断言类中重用了它。出于测试目的,您可以在第一行中对其进行注释,然后对其进行注释,以使其专注于自定义断言的实现。
我希望这可以帮助您实现目标!