Kotlin如何使用assertj创建自定义断言

时间:2019-05-03 02:42:49

标签: spring-mvc kotlin assertj

我想在测试代码的同一文件中创建自定义断言。

我所做的是

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.
}

1 个答案:

答案 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的实现是可以的,并在我的自定义断言类中重用了它。出于测试目的,您可以在第一行中对其进行注释,然后对其进行注释,以使其专注于自定义断言的实现。

我希望这可以帮助您实现目标!