当前位置: 首页 > 知识库问答 >
问题:

使用字符串数组参数重新运行参数化JUnit测试失败

刁远
2023-03-14

在Eclipse中使用参数化JUnit测试时,当我想重新运行一个测试时,遇到了一个问题。测试本身运行良好,虽然我可以从上下文菜单重新运行第一个测试,但可以重新运行第二个测试:

失败,并显示以下消息:

JAVAlang.Exception:未找到匹配[{ExactMatcher:fDisplayName=test[1:A2]的测试--

我很确定这是因为JUnit不喜欢我的数组;在某些情况下:我用它来解释这样一个事实:由于外部环境的原因,被测试的代码可以为特定的测试用例产生两种结果之一。

下面是一些代码来重现这一点:

package com.stackexchange.toolbox;

import java.util.ArrayList;
import java.util.Arrays;

import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

@RunWith(Parameterized.class)
public class Tester {
    public Tester(String source, Object target) {
        this.source = source;
        this.target = target;
    }

    private final String source;
    private final Object target;

    private static final Object[][] testCases = { { "A1", "B1" }, { "A2", new String[] { "B2", "C2" } } };

    @Parameters(name = "{index}: {0} --> {1}")
    public static Iterable<Object[]> data() throws Exception {
        return new ArrayList<>(Arrays.asList(testCases));
    }

    @Test
    public void test() throws Exception {
        if (target instanceof String) {
            Assert.assertEquals(source.charAt(1), ((String)target).charAt(1));
        } else {
            for (String target : (String[])this.target) {
                Assert.assertEquals(source.charAt(1), target.charAt(1));
            }
        }
    }
}

有没有简单的方法来解决这个问题,也许用Lists或变量参数?大多数(100)测试用例都是简单的“源”、“目标”条目,我想保持{“A1”、“B1”}的简洁性。

共有1个答案

段兴为
2023-03-14

这似乎是JUnit4的一个限制(至少在命令行上会出现相同的错误)。

最简单直接的解决方案是从JUnit4迁移到JUnit5,这也意味着代码更少:

package com.stackexchange.toolbox;

import java.util.Arrays;
import java.util.stream.Stream;

import org.junit.Assert;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

class Tester {
    
    private static final Object[][] testCases = { { "A1", "B1" }, { "A2", new String[] { "B2", "C2" } } };

    @ParameterizedTest(name = "{index}: {0} --> {1}")
    @MethodSource("provideArguments")
    void test(String source, Object target) {
        if (target instanceof String) {
            Assert.assertEquals(source.charAt(1), ((String)target).charAt(1));
        } else {
            for (String targetElement : (String[])target) {
                Assert.assertEquals(source.charAt(1), targetElement.charAt(1));
            }
        }
    }

    static Stream<? extends Arguments> provideArguments() throws Exception {
        return Arrays.stream(testCases).map(Arguments::of);
    }

}
 类似资料:
  • 问题内容: 由于重复的注释,以下代码无效: 但是,如何结合使用这两个注释? 问题答案: 至少有两个选项可以做到这一点: 以下http://www.blog.project13.pl/index.php/coding/1077/runwith-junit4-with-both-springjunit4classrunner-and-parameterized/ 您的测试需要看起来像这样: 有一个gi

  • 下面是这个问题:我被要求从哪里开始一个新问题。 问题是我对JUnit了解不够,或者对等的了解不够,无法以Jeff Bowman提到的方式解决这个问题。

  • 问题内容: 这是从这个问题开始的:要求我在哪里开始一个新的问题。 问题是我只是对JUnit 或有关的东西之类的东西还不够了解,无法用Jeff Bowman提到的方式解决问题。 问题答案: 在您以后的评论中,我指出了差距:您需要使用Mockito作为规则,而将参数化为Runner,而不是相反。 原因是Runner负责报告测试数量,而Parameterized则根据测试方法的数量和参数化输入的数量来操

  • 我对JUnit理论很陌生。我有一个方法parse(),它将html字符串作为输入,并返回一个文档(html文档的DOM) 我想用Junit理论编写单元测试。我要检查的边界案例有: null 控制台O/P:

  • 我试图定义一个,如示例MockitoExtension所提供的,但无法成功地使用参数化的类实例。 期待着关于如何用在中实现接口的类的参数化实例测试接口的建议。