2016-11-11 6 views
3

Я пытаюсь начать модульное тестирование проекта Xtext среднего размера.Как использовать различные инъекции объектов в тестах Xtext, чем в продуктивной среде?

Генератор в настоящее время полагается на некоторые внешние ресурсы, которые я хотел бы издеваться над своим тестом. Таким образом, я добавляю нужный объект через @Inject в класс Generator.

в псевдокоде например:

class MyGenerator implements IGenerator{ 

@Inject 
ExternalResourceInterface resourceInterface; 

... 

} 

Я создаю фактическое связывание внутри RuntimeModule языков:

class MyRuntimeModule{ 
... 
    @Override 
    public void configure(Binder binder) { 
     super.configure(binder); 

     binder.bind(ExternalResourceInterface .class).to(ExternalResourceProductionAcess.class); 
    } 
... 
} 

Это прекрасно работает в производственной среде.

Однако в тестовом генератор случая, я хотел бы заменить связывание с моими издевались версиями, так что следующий вызов CompilationTestHelper использует макет:

compiler.assertCompilesTo(dsl, expectedJava); 

Вопрос:

Где я могу указать guice/Xtext для привязки инъекции к макету?

ответ

4

Если вы аннотируете свой тестовый пример с помощью RunWith и InjectWith, ваш тестовый класс будет вводиться через конкретную реализацию IInjectorProvider.

Если поставщик инжектора использует настраиваемый модуль (как вы показали), тестовый пример вводится с использованием этой конфигурации. Однако вы должны убедиться, что используете этот инжектор на протяжении всего тестового кода (например, вы не полагаетесь на зарегистрированный инжектор и т. Д.).

Посмотрите на следующий код в качестве примера (не компилируется, но это базовая структура, вы должны следовать):

@RunWith(typeof(XtextRunner)) 
@InjectWith(typeof(LanguageInjectorProvider)) 
public class TestClass { 

@Inject 
CompilationTestHelper compiler 

... 
} 
+0

Спасибо за ответ. При использовании сгенерированного InjectorProvider загружается мой пользовательский модуль. Однако, поскольку InjectorProvider использует MyRuntimeModule для привязки ExternalResourceProductionAccess, загружается, а не мой макет. Моя попытка написать пользовательский InjectorProvider приводит к тому, что XText не загружает свои вложенные ресурсы. – lwi

+0

Несколько лет назад я настроил InjectorProvider, сгенерированный генератором Xtext в VIATRA. Возможно, вы могли бы взглянуть на это: http://git.eclipse.org/c/viatra/org.eclipse.viatra.git/tree/query/tests/org.eclipse.viatra.query.patternlanguage.emf.tests /src/org/eclipse/viatra/query/patternlanguage/emf/tests/EMFPatternLanguageInjectorProvider.java –