2012-03-07 5 views
1

Я бы хотел протестировать некоторые классы CDI.CDI модульный тест с ELContext и ExpressionFactory

Сегодня я использую 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.

Они используют Seam Solder до @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) 

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

ответ

0

OK Вот что я сделал (вдохновленный that question).

Сначала я удалил .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") в моих тестах!

Смежные вопросы