JUnitでは、次のメソッドを使用して、ユニットテストメソッドにパラメータを渡すことができます。

  1. コンストラクタ

  2. `@ Parameter`によるフィールド注入


P.S JUnit 4.12

でテスト済み

1. MatchUtils – 複数のパラメータでテストする

簡単な追加操作。

MathUtils.java

package com.mkyong.examples;

public class MathUtils {

    public static int add(int a, int b) {
        return a + b;
    }

}

1.2 MatchUtils – コンストラクタを介してパラメータ化される

パラメータは、コンストラクタを介してテストメソッドに渡されます。

ParameterizedTest.java

package com.mkyong;

import com.mkyong.examples.MathUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import java.util.Arrays;
import java.util.Collection;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

@RunWith(value = Parameterized.class)
public class ParameterizedTest {

    private int numberA;
    private int numberB;
    private int expected;

   //Inject via constructor
   //for {8, 2, 10}, numberA = 8, numberB = 2, expected = 10
    public ParameterizedTest(int numberA, int numberB, int expected) {
        this.numberA = numberA;
        this.numberB = numberB;
        this.expected = expected;
    }

   //name attribute is optional, provide an unique name for test
   //multiple parameters, uses Collection<Object[]>
    @Parameters(name = "{index}: testAdd({0}+{1}) = {2}")
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {1, 1, 2},
                {2, 2, 4},
                {8, 2, 10},
                {4, 5, 9},
                {5, 5, 10}
        });
    }

    @Test
    public void test__addTwoNumbes() {
        assertThat(MathUtils.add(numberA, numberB), is(expected));
    }

}

1.3 MatchUtils – フィールドインジェクションによるパラメータ化

パラメータは、フィールド注入を介して試験方法に渡される。

ParameterizedTest.java

package com.mkyong;

import com.mkyong.examples.MathUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runners.Parameterized.Parameter;

import java.util.Arrays;
import java.util.Collection;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

@RunWith(value = Parameterized.class)
public class ParameterizedTest {

   //default value = 0
    @Parameter(value = 0)
    public int numberA;

    @Parameter(value = 1)
    public int numberB;

    @Parameter(value = 2)
    public int expected;

    @Parameters(name = "{index}: testAdd({0}+{1}) = {2}")
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][]{
                {1, 1, 2},
                {2, 2, 4},
                {8, 2, 10},
                {4, 5, 9},
                {5, 5, 10}
        });
    }

    @Test
    public void test__addTwoNumbes() {
        assertThat(MathUtils.add(numberA, numberB), is(expected));
    }

}

出力


junit-parameterized-1、width = 427、height = 224

2. DomainUtils – 単一のパラメータでテストする

別の簡単なクラスで、ドメイン名を検証します。

DomainUtils.java

package com.mkyong.examples;

import java.util.regex.Pattern;

public class DomainUtils {

    private static final String DOMAIN__NAME__PATTERN = "^((?!-)[A-Za-z0-9-]{1,63}(?<!-)\\.)+[A-Za-z]{2,6}$";
    private static Pattern pDomainName = Pattern.compile(DOMAIN__NAME__PATTERN);

    public static boolean isValid(String domainName) {
        return pDomainName.matcher(domainName).find();
    }

}

2.1 DomainUtilsパラメータ化されたテスト

パラメータは、フィールド注入を介して試験方法に渡される。

ParameterizedTest.java

package com.mkyong;

import com.mkyong.examples.DomainUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

@RunWith(value = Parameterized.class)
public class Parameterized2Test {

   //default value = 0
    @Parameter
    public String domainName;

   //Single parameter, use Object[]    @Parameters(name = "{index}: testDomain - {0}")
    public static Object[]data() {
        return new Object[]{
                "google.com",
                "mkyong.com",
                "twitter.com"
        };
    }

    @Test
    public void test__valid__domain() {
        assertThat(DomainUtils.isValid(domainName), is(true));
    }

}

出力


junit-parameterized-2、width = 443、height = 239

  • Note ** + TestNGはユニットテストにパラメータを渡す方法においてより柔軟です。このリンクを読んでください://unittest/testng-tutorial-6-parameterized-test/[TestNG parameter test]

参考文献

  1. link://正規表現/ドメイン名 – 正規表現例/[Domain

パラメータ付きJavaDoc]。 link://unittest/testng-tutorial-6-parameterized-test/[TestNGパラメータ

テスト]。

http://piotrturski.github.io/zohhak/

[Zohhak – JUnitパラメータ化された

Wiki – パラメータ化]