Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit测试方法在运行时的选择_Java_Junit4 - Fatal编程技术网

Java JUnit测试方法在运行时的选择

Java JUnit测试方法在运行时的选择,java,junit4,Java,Junit4,我有一个TestCase类,它有5种测试方法。我可以直接执行这个类,然后执行所有的测试方法。这很好 假设我想执行一些测试方法(但不是全部),并且这些方法将在运行时根据特定条件决定,那么解决方案是什么 更清楚地说, 我有一个测试用例类“MyTestCase” 如果我运行这个类,所有的测试都将被执行 但我的要求是:我不希望所有的方法总是被执行。有时2种方法或3种方法或4种方法等等 我有一个XML文件,它决定了必须执行哪些测试方法。 不管XML文件中有什么,都应该只执行那些测试方法。 (我有一个类,它

我有一个TestCase类,它有5种测试方法。我可以直接执行这个类,然后执行所有的测试方法。这很好

假设我想执行一些测试方法(但不是全部),并且这些方法将在运行时根据特定条件决定,那么解决方案是什么

更清楚地说,

我有一个测试用例类“MyTestCase”

如果我运行这个类,所有的测试都将被执行

但我的要求是:我不希望所有的方法总是被执行。有时2种方法或3种方法或4种方法等等

我有一个XML文件,它决定了必须执行哪些测试方法。 不管XML文件中有什么,都应该只执行那些测试方法。 (我有一个类,它读取XML文件以获取测试方法名。)

是否有任何方法可以控制在运行时在TestCase类中执行的测试方法的数量

我想我必须使用TestSuite类。但我不知道如何准确地使用它。 有人能帮我解决这个问题吗

提前感谢,,
Sunil

您可以使用定制的TestRunner来执行此操作

public class SelectiveJunitRunner extends BlockJUnit4ClassRunner {

    public SelectiveJunitRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }

    @Override
    protected List<FrameworkMethod> computeTestMethods() {
        //Inject ignore List
        List<String> ignoreList = Arrays.asList("test2","test4");
        List<FrameworkMethod> computeTestMethods = super.computeTestMethods();
        List<FrameworkMethod> filteredList = new ArrayList<>();
        for (FrameworkMethod frameworkMethod : computeTestMethods) {
            if (!ignoreList.contains(frameworkMethod.getName()))
                filteredList.add(frameworkMethod);
        }
        return filteredList;
    }



}

有条件执行的测试是一个坏消息,因为它增加了复杂性。你的理由是什么?每次运行时都应该自动执行一个测试,如果需要执行,我建议将每个方法分成它自己的案例。我试过了。它不起作用。当我运行JUnit测试用例时,它抛出了IllegalArgumentException(在JUnitRunner类中)。当我运行您的代码时,它运行良好。但当我在代码上应用相同的规则时,它会抛出一个异常。例外情况是:java.lang.IllegalArgumentException:测试类在com…junitrunner上应该只有一个公共零参数构造函数。我的TestCase类有一个构造函数,它接受连接参数。如果我运行这个测试类,我会得到上面的异常。后来我引入了另一个构造函数(零参数),但我仍然得到了一个异常:测试类只能有一个构造函数。我尝试了两种方法,但仍然不起作用……在Junit测试用例中不应该有构造函数。更多关于这个。在
@BeforeClass
@Before
中创建连接对象。
public class SelectiveJunitRunner extends BlockJUnit4ClassRunner {

    public SelectiveJunitRunner(Class<?> klass) throws InitializationError {
        super(klass);
    }

    @Override
    protected List<FrameworkMethod> computeTestMethods() {
        //Inject ignore List
        List<String> ignoreList = Arrays.asList("test2","test4");
        List<FrameworkMethod> computeTestMethods = super.computeTestMethods();
        List<FrameworkMethod> filteredList = new ArrayList<>();
        for (FrameworkMethod frameworkMethod : computeTestMethods) {
            if (!ignoreList.contains(frameworkMethod.getName()))
                filteredList.add(frameworkMethod);
        }
        return filteredList;
    }



}
@RunWith(SelectiveJunitRunner.class)
public class SelectiveTest {

    @Test
    public void test1() {
        System.out.println("1");
    }
    @Test
    public void test2() {
        System.out.println("2");
    }
    @Test
    public void test3() {
        System.out.println("3");
    }
    @Test
    public void test4() {
        System.out.println("4");
    }

}