执行单个测试时 Eclipse 和 JUNIT4 的初始化错误

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12798079/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-19 19:09:53  来源:igfitidea点击:

initializationError with Eclipse and JUNIT4 when executing a single test

javaeclipsejunit4eclipse-indigo

提问by dierre

My test class is this one:

我的测试课是这样的:

    /**
     * The Class TestAddSubscriber.
     */
    @RunWith(LabelledParameterized.class)
    public class TestAddSubscriber extends AbstractTestSubscriber {

        /**
         * Instantiates a new test add subscriber.
         * 
         * @param label
         *            the label
         * @param apiKey
         *            the api key
         * @param userKey
         *            the user key
         * @param customerId
         *            the customer id
         */
        public TestAddSubscriber(String label, String apiKey, String userKey,
                int customerId) {
            super(label, apiKey, userKey, customerId);
        }

        /**
         * @see com.contactlab.api.test.AbstractTest#setUp()
         */
        @Override
        @Before
        public void setUp() throws Exception {
            super.setUp();
        }

        /**
         * @see com.contactlab.api.test.AbstractTest#tearDown()
         */
        @Override
        @After
        public void tearDown() throws Exception {
            super.tearDown();
        }

        /**
         * Generated data.
         * 
         * @return the collection
         */
        @Parameters
        public static Collection<Object[]> generatedData() {
            return DataProvider.generatedCorrectSubscriberData();
        }

        /**
         * Test add subscriber with internal pk id case sensitive.
         * 
         * @outcome: success
         * @expected: success
         * @obtained: success
         */
        @Test
        public void testAddSubscriberWithInternalPkIdCaseSensitive() {

  /** this is the test **/

        }

    /**
    * other tests
    **/
    }

If I execute the Test Suite I'm not having problem but If highlight only one of them and run it I'm having Unrooted Tests -> InitializationError

如果我执行测试套件我没有问题但是如果只突出显示其中一个并运行它我有 Unrooted Tests -> InitializationError

The class uses Parameterized.

该类使用Parameterized.

The exception is:

例外是:

TestAddSubscriber.testAddSubscriberWithInternalPkIdCaseSensitive
Unrooted Tests
initializationError(org.junit.runner.manipulation.Filter)
java.lang.Exception: No tests found matching Method testAddSubscriberWithInternalPkIdCaseSensitive(com.contactlab.api.test.subscriber.TestAddSubscriber) from org.junit.internal.requests.ClassRequest@18872380
    at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:37)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestMethodReference.<init>(JUnit4TestMethodReference.java:25)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:54)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Is there something I'm doing wrong?

有什么我做错了吗?

采纳答案by Chetan

You can possibly workaround the problem by overriding the org.junit.runners.ParentRunner#filter by extending the Parameterized

您可以通过扩展 Parameterized 覆盖 org.junit.runners.ParentRunner#filter 来解决该问题

public class IDECompatibleParameterized extends Parameterized {

    public void filter(Filter filter) throws NoTestsRemainException {
        super.filter(new FilterDecorator(filter));
    }

   /**
     * Running single test in case of parameterized test causes issue as explained in
     * http://youtrack.jetbrains.com/issue/IDEA-65966
     *
     * As a workaround we wrap the original filter and then pass it a wrapped description
     * which removes the parameter part (See deparametrizedName)
     */
    private static class FilterDecorator extends Filter {
        private final Filter delegate;

        private FilterDecorator(Filter delegate) {
            this.delegate = delegate;
        }

        @Override
        public boolean shouldRun(Description description) {
            return delegate.shouldRun(wrap(description));
        }

        @Override
        public String describe() {
            return delegate.describe();
        }
    }

    private static Description wrap(Description description) {
        String name = description.getDisplayName();
        String fixedName = deparametrizedName(name);
        Description clonedDescription =
                Description.createSuiteDescription(fixedName,description.getAnnotations().toArray(new Annotation[0]));
        for(Description child : description.getChildren()){
            clonedDescription.addChild(wrap(child));
        }
        return clonedDescription;
    }

    private static String deparametrizedName(String name) {
        //Each parameter is named as [0], [1] etc
        if(name.startsWith("[")){
            return name;
        }

        //Convert methodName[index](className) to
        //methodName(className)
        int indexOfOpenBracket = name.indexOf('[');
        int indexOfCloseBracket = name.indexOf(']')+1;
        return name.substring(0,indexOfOpenBracket).concat(name.substring(indexOfCloseBracket));
    }
}

Another way would be to change the method name in Launch configuration to have the parameter name like testAddSubscriberWithInternalPkIdCaseSensitive[0]

另一种方法是更改​​ Launch 配置中的方法名称以具有类似的参数名称 testAddSubscriberWithInternalPkIdCaseSensitive[0]