ejb - 使用spring测试EJB拦截器
问题描述
我想测试(使用功能测试)被 EJB Iterceptor 拦截的 EJB 服务。此应用程序在 WildFly 服务器上运行。
考试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {FooServiceTest.ClassContextTest.class})
public class FooServiceTest {
@Autowired public FooServiceImpl service;
@Test
public void createTest() throws Exception {
Foo foo = new Foo();
// ...
service.create(foo);
// ...
}
@Configuration
public static class ClassContextTest {
@Bean
public FooServiceImpl produceService() {
return new FooServiceImpl();
}
@Bean
public FooDao produceDao() {
//...
}
}
}
服务:
@Stateless
@Interceptors({ValidationInterceptor.class})
public class FooServiceImpl implements FooService {
private FooDao dao;
@Inject
public void setDao(FooDao dao) {
this.dao = dao;
}
public void create(@Valid Foo foo) {
// ...
dao.create(foo);
// ...
}
//...
}
拦截器:
public class ValidationInterceptor {
private Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
@AroundInvoke
public Object intercept(InvocationContext ctx) throws Exception {
Object[] paramValues = ctx.getParameters();
Parameter[] params = ctx.getMethod().getParameters();
for (int i = 0; i < params.length; i++) {
if (params[i].isAnnotationPresent(Valid.class)) {
Object value = paramValues[i];
valid(value);
}
}
return ctx.proceed();
}
private void valid(Object value) throws ConstraintViolationException {
Set<ConstraintViolation<Object>> violations = validator.validate(value);
if (!violations.isEmpty()) {
Set<ConstraintViolation<?>> cvs = new HashSet<>();
for (ConstraintViolation<?> cv : violations) {
cvs.add(cv);
}
throw new ConstraintViolationException(cvs);
}
}
}
我的测试设法测试了服务、DAO 和映射器,但根本没有调用拦截器。我猜这是因为我在 Spring 测试中使用了 JavaEE 拦截器,但我不知道如何使它工作。我正在使用 Spring 4.3 和 JavaEE 7。
解决方案
我使用weld-junit4 将weld 用作容器而不是Spring。
public class FooServiceTest {
@Rule
public WeldInitiator weld = WeldInitiator.from(FooServiceImpl.class, this.getClass()).build();
public FooServiceImpl service;
private static DataSource ds;
@BeforeClass
public static void beforeClass() {
ds = h2DataSource();
}
@Test
public void createTest() throws Exception {
Foo foo = new Foo();
// ...
service.create(foo);
// ...
}
@Produces
public FooDao produceDao() {
FooDao dao = new FooDao() {};
dao.setDataSource(ds);
return dao;
}
public static DataSource h2DataSource() {
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).addScript("my/path/scripts.sql").build();
}
}
通过这种方式,我能够使用 JavaEE 注入@Interceptors
并@Inject
使用 Spring 使用 H2 模拟数据库。
推荐阅读
- sql - Laravel Auth 注册用户失败
- c# - 如何在 Xamarin 上使用 AppSettings 插件?我希望能够保存用户在 EmailEntry 上输入的内容
- javascript - vue:this在不同的范围内得到相同的对象
- python-3.x - 我们如何添加具有相同 id 的数据框?
- java - 无法在 puTTY 中使用 Java 找到或加载主类
- python - 从服务器检索大量数据时 Python 崩溃
- java - 我的代码有什么问题吗?为什么压缩和解压缩速度比其他应用程序慢?
- java - 稳定的婚姻问题 - 代码不返回任何人的合作伙伴/选择
- solr - Solr 8.0.0 增量导入问题
- azure - 如何在 B2C 中设置密码重置用户流程以避免非广告用户的电子邮件地址