Почему IllegalArgumentException вызывается для параметризованного теста JUnit, когда задан List <List <Any>>, но работает со List <Array <Any>> - PullRequest
0 голосов
/ 02 сентября 2018

Во время отладки параметризованного теста я понял, что тест не будет выполняться, если параметры были переданы в виде списка списков (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: неверное количество аргументов

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 передает неправильное количество аргументов?

1 Ответ

0 голосов
/ 02 сентября 2018

Я не знаком с параметризованным тестированием с помощью JUnit. Тем не менее, я нашел это . Если вы посмотрите на подпись метода:

public static Collection<Object[]> data() 

В Котлине это:

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

Вы увидите, что это коллекция, содержащая массив объектов. List - это коллекция, но List - это не Array. Это двумерная система, где второе измерение содержит аргументы, которые вы хотите передать, включая длину.

Поскольку они используют массив в документах, я бы посоветовал вам сделать это.

Недавно они ввели отдельные параметры. Подпись выглядит так:

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

И снова, Список является Итерируемым. Однако в вашем случае это тот, который вы в конечном итоге вызывали без массива.

В результате вы передали один аргумент конструктору с двумя аргументами, который вызвал исключение. Вы передали Iterable>, который не является Collection<Array<Any>>. Это означает, что вместо этого вы создали систему, которая работает для одного аргумента. Поскольку конструктор принимает два аргумента, вы получаете исключение. Вы передаете один аргумент (список), но вам нужно два аргумента.

Вот почему использование массива работает, а List - нет; если вы используете список, предполагается, что у вас есть конструктор с одним аргументом, где, как и в случае с массивом, требуется несколько. Насколько я могу судить, JUnit не поддерживает списки вместо массивов для конструкторов с несколькими аргументами.


TL; DR: Причина, по которой массивы работают, а список - нет, заключается в том, что он считает, что список является аргументом для конструктора с одним аргументом, где, как и в случае с массивом, он может быть любым числом аргументы.

...