使用 Junit 的回调单元测试用例

Unit test cases for Callbacks using Junit

我正在尝试为 class 编写一些单元测试用例,其中包含以回调作为参数的函数(请参阅下面的代码)

class NetworkApi(private val url: String) {

    fun getToken(listener: (String) -> Unit) {
        Thread(Runnable {
            Thread.sleep(2000)
            if (TextUtils.isEmpty(url)) listener("")
            else listener("Dummy token")
        }).start()
    }
}

单元测试用例是

@RunWith(AndroidJUnit4::class)
class NetworkApiTest {

    var networkApi: NetworkApi? = null

    @Test
    fun testEmptyToken() {
        networkApi = NetworkApi("")
        networkApi?.getToken {
            Assert.assertThat(it, isEmptyOrNullString())
        }
    }

}

每当我 运行 这个测试用例时,无论我发送什么值,我都会成功。我知道我没有做正确的事情。 有人可以帮我在 JUnit 中为 classes 编写单元测试用例吗?

问题是测试在调用回调之前完成并且 assert 在错误的线程中。 您必须将回调的结果复制回主线程。使用 CompletableFuture。 如果你想在一段时间后测试失败,你可以使用带有超时值的 get 方法:

@RunWith(AndroidJUnit4::class)
class NetworkApiTest {
    var networkApi: NetworkApi? = null

    @Test
    fun testEmptyToken() {
        val future = CompletableFuture<String>()
        networkApi = NetworkApi("")
        networkApi?.getToken {
            future.complete(it)
        }
        val result = future.get(3,TimeUnit.SECONDS)
        Assert.assertThat(it, isEmptyOrNullString())
    }
}