Как запустить JUnit 4 Data Drived Test с несколькими данными - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь написать тесты junit для класса с двумя перегруженными методами.Вот мой тестируемый код

public class Solution {
    public static String getDurationString(int minute, int seconds) {
        if (minute < 0) {
            return "Invalid Value";
        } else if (seconds < 0 || seconds > 59) {
            return "Invalid Value";
        } else {
            int hours = minute / 60;
            minute %= 60;
            return getTimeString(hours) + "h " + getTimeString(minute) + "m " + seconds + "s";
        }
    }

    public static String getDurationString(int seconds) {
        if (seconds < 0) {
            return "Invalid Value";
        }

        int minutes = seconds / 60;
        seconds %= 60;
        int hours = minutes / 60;
        minutes %= 60;

        return getTimeString(hours) + "h " + getTimeString(minutes) + "m " + seconds + "s";
    }

    //returns value in xx format
    private static String getTimeString(int val) {
        if (val < 10) {
            return "0" + val;
        }
        return "" + val;
    }
}

Я могу протестировать функцию getDurationString (min, sec), используя некоторые данные, используя Parameterized Runner JUnit.Я хочу использовать тот же тест-код, чтобы написать тест для функции getDurationString (sec), но я не уверен, как это сделать.Я посмотрел на вопрос stackoverflow , но это не помогает (может быть потому, что я использую JUnit4).

Есть идеи, как этого добиться с помощью JUnit4?

ОБНОВЛЕНИЕ: добавлен тестовый код для справки

import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import static org.junit.Assert.assertEquals;

@RunWith(Parameterized.class)
class SolutionTest {

    @Parameterized.Parameters(name = "Test{index} -> {0} min {1} sec returns {2}")
    public static Iterable<Object[]> dataForTwoParameterMethod() {
        return Arrays.asList(new Object[][]{
                {-1, 10, "Invalid Value"}, //minutes < 0 returns "Invalid value"
                {1, -1, "Invalid Value"}, //Negative seconds value
                {61, 50, "01h 01m 50s"}, //valid value returns time in format "XXh YYm ZZs"
        });
    }

    int minute;
    int seconds;
    String durationString;

    public SolutionTest(int minute, int seconds, String durationString) {
        this.minute = minute;
        this.seconds = seconds;
        this.durationString = durationString;
    }

    @Test
    public void getDurationString() {
        assertEquals(durationString, Solution.getDurationString(minute, seconds));
    }

    @Test @Ignore("TODO: Not able to find a way to inject two different data into one JUnit Test")
    public void testGetDurationString() {
        //TODO: how to use two data in single data driven test
    }
}

1 Ответ

1 голос
/ 25 сентября 2019

Если я вас правильно понял, у вас есть один набор параметров:

{-1, 10, "Invalid Value"}, //minutes < 0 returns "Invalid value"
{1, -1, "Invalid Value"}, //Negative seconds value
{61, 50, "01h 01m 50s"}, //valid value returns time in format "XXh YYm ZZs"

, который вы используете для проверки метода с двумя аргументами getDurationString.И - это мое понимание - вы также хотите предоставить второй набор параметров, возможно

{-1, "Invalid Value"}, //seconds < 0 returns "Invalid value"minutes, "
{0, "00h 00m 00s"}, //boundary case, everything zero
{1, "00h 00m 01s"}, //last digit (seconds)
{10, "00h 00m 10s"}, //but last digit (seconds)
{59, "00h 00m 59s"}, //boundary case
{60, "00h 01m 00s"}, //boundary case, last digit (minutes)
...

, чтобы проверить метод с одним аргументом getDurationString.Однако, чтобы сделать это с JUnit4, вам нужно будет создать второй тестовый класс - вы не можете поместить два разных набора параметров в один и тот же класс.

В одном классе с параметризованными тестами может быть много тестовых методов.- но все они будут работать с одним и тем же набором параметров, как определено в @Parameterized.Parameters.

Обратите внимание, что это отличается от способа, которым параметризованные тесты реализованы в JUnit5: в JUnit5 для каждого отдельного параметризованного метода тестирования этоМожно решить отдельно, какие входные параметры должен получить метод испытаний.Это делается путем аннотирования каждого метода испытаний информацией, откуда поступают данные испытаний: https://junit.org/junit5/docs/current/user-guide/#writing-tests-parameterized-tests

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...