2017-02-23 11 views
1

목적 : xtext/xtend 컨텍스트 내에서 매개 변수화 된 테스트를 실행합니다.매개 변수화 된 xtext xtext 러너

진행률 : 지금까지 실행하기에 이르렀지만 junit 창에는 잘못 표시됩니다.

문제점 : 두 테스트의 실패 추적 및 결과는 아래 그림과 같이 마지막 테스트에서 나타납니다. 빨간색 펜으로 표시된 첫 번째 테스트는 일종의 미해결이며 오류 추적을 포함하지 않습니다.

@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&) :

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 :

class XtextParametersRunnerFactory implements ParametersRunnerFactory { 
    override createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError { 
     new ParameterizedXtextRunner(test) 
    } 
} 
,536,913 여기

junit window

는 테스트 클래스

답변

1

XtextRunner 클래스를 보면 BlockJUnit4ClassRunner에서 상속받습니다. 매개 변수화 된 매개 변수는이 러너를 확장하지 않지만 ParentRunner입니다. 그러나, 그래서 BlockJUnit4ClassRunner 따라서 우리는 다음과 같이 그것을 구현하지 :

public class XtextParametersRunnerFactory implements ParametersRunnerFactory { 
    @Override 
    public Runner createRunnerForTestWithParameters(TestWithParameters test) throws InitializationError { 
     return new XtextRunnerWithParameters(test); 
    } 
} 

그리고 XtextRunner의 코드를 사용하고 새로운 주자에 넣어 -

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()); 
    } 

} 
뿐만 아니라 Xtext에서 InjectorProviders를 추출하는 것이 필요하다

테스트 만들기 :

@RunWith(typeof(Parameterized)) 
@InjectWith(SemanticAdaptationInjectorProvider) 
@Parameterized.UseParametersRunnerFactory(XtextParametersRunnerFactory) 
class xxx 
{ 
    @Inject extension ParseHelper<SemanticAdaptation> 
    @Inject extension ValidationTestHelper 
// Here goes standard parameterized stuff 

}