首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >xtext参数化xtext转轮

xtext参数化xtext转轮
EN

Stack Overflow用户
提问于 2017-02-23 15:45:45
回答 2查看 208关注 0票数 2

用途:在xtext/x趋向上下文中运行参数化测试。

进步:到目前为止,我已经实现了运行它,但是它在junit窗口中看起来是错误的。

问题:在最后一次测试中出现两个测试的故障跟踪和结果,如下图所示。用红笔标记的第一个测试有点未解决,并且不包含任何故障跟踪。

下面是测试类:

代码语言:javascript
复制
@RunWith(typeof(Parameterized))
@InjectWith(SemanticAdaptationInjectorProvider)
@Parameterized.UseParametersRunnerFactory(XtextParametersRunnerFactory)
class CgCppAutoTest extends AbstractSemanticAdaptationTest {

    new (List<File> files)
    {
        f = files;
    }

    @Inject extension ParseHelper<SemanticAdaptation>
    @Inject extension  ValidationTestHelper

    @Parameters(name = "{index}")
    def static Collection<Object[]> data() {
        val files = new ArrayList<List<File>>();
        listf("test_input", files);
        val test = new ArrayList();
        test.add(files.get(0));
        return Arrays.asList(test.toArray(), test.toArray());
    }

    def static void listf(String directoryName, List<List<File>> files) {
        ...
    }

    var List<File> f;

    @Test def allSemanticAdaptations() {
        System.out.println("fail");
        assertTrue(false);
    }
}

ParameterizedXtextRunner (这里的灵感来源:https://www.eclipse.org/forums/index.php?t=msg&th=1075706&goto=1726802&):

代码语言:javascript
复制
class ParameterizedXtextRunner extends XtextRunner {
    val Object[] parameters;
    val String annotatedName;
    new(TestWithParameters test) throws InitializationError {
        super(test.testClass.javaClass)
        parameters = test.parameters;
        annotatedName = test.name;
    }
    override protected getName() {
        return super.name + annotatedName;
    }
    override protected createTest() throws Exception {
        val object = testClass.onlyConstructor.newInstance(parameters)
        val injectorProvider = getOrCreateInjectorProvider
        if (injectorProvider != null) {
            val injector = injectorProvider.injector
            if (injector != null)
                injector.injectMembers(object)
        }
        return object;
    }
    override protected void validateConstructor(List<Throwable> errors) {
        validateOnlyOneConstructor(errors)
    }

最后,XtextParametersRunnerFactory:

代码语言:javascript
复制
class XtextParametersRunnerFactory implements ParametersRunnerFactory {
    override createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError {
        new ParameterizedXtextRunner(test)
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-27 08:08:52

通过查看XtextRunner类,它继承了BlockJUnit4ClassRunner。参数化不是扩展这个运行程序,而是扩展ParentRunner。然而,BlockJUnit4ClassRunner也是如此,因此我们实现它如下:

代码语言:javascript
复制
public class XtextParametersRunnerFactory implements ParametersRunnerFactory {
    @Override
    public Runner createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError {
        return new XtextRunnerWithParameters(test);
    }
}

并使用XtextRunner中的代码并将其放入新的运行程序--从Xtext提取InjectorProviders也是必要的。

代码语言:javascript
复制
public class XtextRunnerWithParameters extends BlockJUnit4ClassRunnerWithParameters {
    public XtextRunnerWithParameters(TestWithParameters test) throws InitializationError {
        super(test);
    }

    @Override
    public Object createTest() throws Exception {
        Object object = super.createTest();
        IInjectorProvider injectorProvider = getOrCreateInjectorProvider();
        if (injectorProvider != null) {
            Injector injector = injectorProvider.getInjector();
            if (injector != null)
                injector.injectMembers(object);
        }
        return object;
    }

    @Override
    protected Statement methodBlock(FrameworkMethod method) {
        IInjectorProvider injectorProvider = getOrCreateInjectorProvider();
        if (injectorProvider instanceof IRegistryConfigurator) {
            final IRegistryConfigurator registryConfigurator = (IRegistryConfigurator) injectorProvider;
            registryConfigurator.setupRegistry();
            final Statement methodBlock = superMethodBlock(method);
            return new Statement() {
                @Override
                public void evaluate() throws Throwable {
                    try {
                        methodBlock.evaluate();
                    } finally {
                        registryConfigurator.restoreRegistry();
                    }
                }
            };
        }else{
            return superMethodBlock(method);
        }
    }

    protected Statement superMethodBlock(FrameworkMethod method) {
        return super.methodBlock(method);
    }

    protected IInjectorProvider getOrCreateInjectorProvider() {
        return InjectorProviders.getOrCreateInjectorProvider(getTestClass());
    }

    protected IInjectorProvider getInjectorProvider() {
        return InjectorProviders.getInjectorProvider(getTestClass());
    }

    protected IInjectorProvider createInjectorProvider() {
        return InjectorProviders.createInjectorProvider(getTestClass());
    }

}

创建测试:

代码语言:javascript
复制
@RunWith(typeof(Parameterized))
@InjectWith(SemanticAdaptationInjectorProvider)
@Parameterized.UseParametersRunnerFactory(XtextParametersRunnerFactory)
class xxx
{
    @Inject extension ParseHelper<SemanticAdaptation>
    @Inject extension  ValidationTestHelper
 // Here goes standard parameterized stuff

}
票数 2
EN

Stack Overflow用户

发布于 2018-11-18 21:27:26

由于OSGi导入包的限制和反对,我使用了原始代码的这种方式:

代码语言:javascript
复制
package de.uni_leipzig.pkr.handparser.tests.runners;

import org.eclipse.xtext.testing.IInjectorProvider;
import org.eclipse.xtext.testing.IRegistryConfigurator;
import org.eclipse.xtext.testing.XtextRunner;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError;
import org.junit.runners.model.Statement;
import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters;
import org.junit.runners.parameterized.TestWithParameters;

import com.google.inject.Injector;

public class XtextRunnerWithParameters extends BlockJUnit4ClassRunnerWithParameters {

    public static class MyXtextRunner extends XtextRunner {

        public MyXtextRunner(Class<?> testClass) throws InitializationError {
            super(testClass);
        }

        public IInjectorProvider getOrCreateInjectorProvider() {
            return super.getOrCreateInjectorProvider();
        }
    }

    private MyXtextRunner xtextRunner;

    public XtextRunnerWithParameters(TestWithParameters test) throws InitializationError {
        super(test);
        xtextRunner = new MyXtextRunner(test.getTestClass().getJavaClass());
    }

    @Override
    public Object createTest() throws Exception {
        Object object = super.createTest();
        IInjectorProvider injectorProvider = xtextRunner.getOrCreateInjectorProvider();
        if (injectorProvider != null) {
            Injector injector = injectorProvider.getInjector();
            if (injector != null)
                injector.injectMembers(object);
        }
        return object;
    }

    @Override
    protected Statement methodBlock(FrameworkMethod method) {
        IInjectorProvider injectorProvider = xtextRunner.getOrCreateInjectorProvider();
        if (injectorProvider instanceof IRegistryConfigurator) {
            final IRegistryConfigurator registryConfigurator = (IRegistryConfigurator) injectorProvider;
            registryConfigurator.setupRegistry();
            final Statement methodBlock = superMethodBlock(method);
            return new Statement() {
                @Override
                public void evaluate() throws Throwable {
                    try {
                        methodBlock.evaluate();
                    } finally {
                        registryConfigurator.restoreRegistry();
                    }
                }
            };
        } else {
            return superMethodBlock(method);
        }
    }

    protected Statement superMethodBlock(FrameworkMethod method) {
        return super.methodBlock(method);
    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42420267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档