我想测试一些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>
版本位于父pom中,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 :(得分:0)
好的,这就是我的所作所为(灵感来自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")
了!