android - 为什么在给定 List<List<Any>> 时,参数化 JUnit 测试会抛出 IllegalArgumentException,但适用于 List<Array<Any>>

标签 android unit-testing kotlin junit4 parameterized-tests

在调试参数化测试时,我意识到如果参数作为列表列表 ( List<List<Any>> ) 传递,但使用数组列表 ( List<Array<Any>> ) 则可以正常工作,则测试将无法运行。

示例类:

import com.google.common.truth.Truth
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized


@RunWith(Parameterized::class)
class TestWithList(val input: List<Int>, val output: Int) {

    companion object {
        @JvmStatic
        @Parameterized.Parameters
        fun data(): List<List<Any>> =
                listOf(
                        listOf(
                                listOf(1, 4, 3, 2),
                                4
                        )
                )

    }

    @Test
    fun `empty test`() {
        Truth.assertThat(true).isTrue()
    }
}

抛出

IllegalArgumentException: wrong number of arguments

import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized

@RunWith(Parameterized::class)
class TestWithArray(val input: List<Int>, val output: Int) {

    companion object {
        @JvmStatic
        @Parameterized.Parameters
        fun data(): List<Array<Any>> =
                listOf(
                        arrayOf(
                                listOf(1, 4, 3, 2),
                                4
                        )
                )

    }

    @Test
    fun `empty test`() {
        assertThat(true).isTrue()
    }
}

运行完美。

为什么传递 List传递了错误数量的参数?

最佳答案

我不熟悉 JUnit 的参数化测试。不过,我确实找到了this 。如果您查看方法签名:

public static Collection<Object[]> data() 

在 Kotlin 中,即:

fun data() : Collection<Array<Any>>

您将看到它是一个集合,包含一个对象数组。 List是一个集合,但是一个 List不是Array 。它是一个二维系统,其中第二个维度包含您要传递的参数,包括长度。

由于他们在文档中使用数组,我建议您这样做。

最近,他们引入了单一参数。签名如下所示:

@Parameters
public static Iterable<? extends Object> data() 

再说一次,List 是一个 Iterable。但是,就您而言,这是您最终在没有数组的情况下调用的。

因此,您将单个参数传递给了两个参数的构造函数,这引发了异常。您传递了一个 Iterable>,它不是 Collection<Array<Any>> 。这意味着您最终创建了一个适用于单个参数的系统。由于构造函数采用两个参数,因此您会得到异常。您传递一个参数(列表),但需要两个参数。

这就是为什么使用数组可以,但列表不行;如果您使用列表,它假设您有一个参数构造函数,而与数组一样,它需要多个参数。据我所知,JUnit 不支持列表而不支持多参数构造函数的数组。


TL;DR: 数组起作用而列表不起作用的原因是它认为 List 是单参数构造函数的参数,而与 Array 一样,它可以是任何数字的论点。

关于android - 为什么在给定 List<List<Any>> 时,参数化 JUnit 测试会抛出 IllegalArgumentException,但适用于 List<Array<Any>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52140295/

相关文章:

c - Kotlin native : C objects ownership and lifespan

class - 如何检查两个对象在 Kotlin 中是否具有相同的类?

swift - 为什么 Alamofire 对单元测试的超时预期使用 30 秒?

java - 检测用户名是否已被使用并向此人显示错误消息?

android自定义 ListView 适配器不更新getView中的 View 数

android - 创建多线程实现ftp下载并在imageview中显示

javascript - 如何测试使用钩子(Hook)且不返回 JSX 的 ReactJS 函数

使用 Retrofit2 和 Mockito 或 Robolectric 进行 Android 单元测试

android - 编写 espresso 测试时如何在设置 dagger-android 2.15 后进行模拟?

java - Firebase Firestore : How to convert document object to a POJO on Android