Модульный тест CDI с ELContext и ExpressionFactory - PullRequest
1 голос
/ 07 марта 2012

Я бы хотел протестировать некоторые классы CDI.

Сегодня я использую Arquillian , чтобы сделать это следующим образом:

@RunWith(Arquillian.class)
public class MyCDIBeanTest {

    @Deployment
    public static JavaArchive createTestArchive() {
        return ShrinkWrap
                .create(JavaArchive.class, "test.jar")
                .addClasses(MyCDIBean.class)
                .addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create("beans.xml"));
    }

    ...

Вот мойтекущая pom.xml:

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.arquillian.junit</groupId>
    <artifactId>arquillian-junit-container</artifactId>
    <version>1.0.0.CR6</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.arquillian.container</groupId>
    <artifactId>arquillian-container-test-spi</artifactId>
    <version>1.0.0.CR6</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.arquillian.container</groupId>
    <artifactId>arquillian-container-spi</artifactId>
    <version>1.0.0.CR6</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.arquillian.container</groupId>
    <artifactId>arquillian-weld-ee-embedded-1.1</artifactId>
    <version>1.0.0.CR3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.weld</groupId>
    <artifactId>weld-core</artifactId>
    <version>1.0.0.CR3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.weld</groupId>
    <artifactId>weld-api</artifactId>
    <version>1.1.2.Final</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.jboss.weld</groupId>
    <artifactId>weld-spi</artifactId>
    <version>1.1.2.Final</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <scope>test</scope>
</dependency>

Версии находятся в родительской помпе, а weld и slf4j версии импортируются с

<dependency>
    <groupId>org.jboss.weld</groupId>
    <artifactId>weld-core-bom</artifactId>
    <version>1.1.2.Final</version>
    <scope>import</scope>
    <type>pom</type>
</dependency>

До сих пор все работало хорошо.

Сегодня я хочу протестировать некоторые классы, которые используют javax.el.ElContext и javax.el.ExpressionFactory.

Они используют Припой для швов до @Inject их.

Итак, я добавил .addPackage(org.jboss.solder.el.Expressions.class.getPackage()) к ShrinkWrap.

Но теперь вот что я получил:

javax.el.ELException: Provider org.apache.el.ExpressionFactoryImpl not found
    at javax.el.FactoryFinder.newInstance(FactoryFinder.java:97)
    at javax.el.FactoryFinder.find(FactoryFinder.java:193)
    at javax.el.ExpressionFactory.newInstance(ExpressionFactory.java:185)
    at javax.el.ExpressionFactory.newInstance(ExpressionFactory.java:156)
    at org.jboss.solder.el.ExpressionFactoryProducer.createExpressionFactory(ExpressionFactoryProducer.java:35)

Кто-нибудь знает, как я могу сделать это лучше?(или просто работает)

1 Ответ

0 голосов
/ 09 марта 2012

ОК, вот что я сделал (вдохновленный этим вопросом ).

Сначала я удалил .addPackage(Expressions.class.getPackage()).

Затем я добавил зависимость к Juel :

<dependency>
    <!-- Used to simulate El expressions without Faces environment -->
    <groupId>de.odysseus.juel</groupId>
    <artifactId>juel-impl</artifactId>
    <version>2.2.4</version>
    <scope>test</scope>
</dependency>

Затем в своем тесте я добавил этот код:

/// Methods & variables for the elContext ///
static SimpleContext elContext = new SimpleContext();
static ExpressionFactory expressionFactory = new ExpressionFactoryImpl();

@Produces @RequestScoped
public static ELContext getElContext() {
    return elContext;
}

@Produces @RequestScoped
public static ExpressionFactory getExpressionFactory() {
    return expressionFactory;
}

@Before
public void reInitElContext() {
    elContext = new SimpleContext();
}

private void setElVariable(final String variableName, final Object variableValue) {
    setElVariable(variableName, variableValue, variableValue.getClass());
}

private void setElVariable(final String variableName, final Object variableValue, final Class<? extends Object> variableClass) {
    expressionFactory.createValueExpression(elContext, "#{"+variableName+"}", variableClass).setValue(elContext, variableValue);
}

private void setElNullVariable(final String variableName, final Class<?> variableClass) {
    setElVariable(variableName, null, variableClass);
}

/**
 * By default, set a null String variable
 * @param variableName
 */
private void setElNullVariable(final String variableName) {
    setElNullVariable(variableName, String.class);
}

Теперь я могу использовать setElVariable("variableName", "value") в своих тестах!

...