Я создал перехватчик в соответствии с документацией JBoss а>.
Для проверки перехватчика поставил:
@Interceptor
@Transactional
public class TransactionalInterceptor {
@AroundInvoke
public Object intercept(InvocationContext ctx) throws Exception {
System.out.println("intercept!");
return ctx.proceed();
}
}
Теперь я хотел протестировать этот перехватчик в модульном тесте, используя класс WeldJUnit4Runner.
@RunWith(WeldJUnit4Runner.class)
public class MyTest {
@Test
@Transactional // the interceptor I created
public void testMethod() {
System.out.println("testMethod");
anotherMethod();
}
@Transactional
public void anotherMethod() {
System.out.println("anotherMethod");
}
}
Теперь ожидаемый результат, конечно, будет
intercept!
testMethod
intercept!
anotherMethod
Но вместо этого вывод
intercept!
testMethod
anotherMethod
Основная проблема заключается в том, что это также верно, если я ввожу bean-компонент в свой тест: первый метод bean-компонента, который я вызываю, перехватывается, но если этот метод вызывает другой метод, перехватчик не вызывается.
Любые идеи вообще высоко ценятся!
Я только что попытался изменить свой код, как предложил @adrobisch, и это работает:
@RunWith(WeldJUnit4Runner.class)
public class MyTest {
@Inject
private MyTest instance;
@Test
@Transactional // the interceptor I created
public void testMethod() {
System.out.println("testMethod");
instance.anotherMethod();
}
@Transactional
public void anotherMethod() {
System.out.println("anotherMethod");
}
}
Результат (как и ожидалось)
intercept!
testMethod
intercept!
anotherMethod
Однако следующее не работает:
@RunWith(WeldJUnit4Runner.class)
public class MyTest {
@Inject
private MyTest instance;
@Test
// @Transactional <- no interceptor here!
public void testMethod() {
System.out.println("testMethod");
instance.anotherMethod();
}
@Transactional
public void anotherMethod() {
System.out.println("anotherMethod");
}
}
Выход здесь
testMethod
anotherMethod
Однако это, похоже, соответствует спецификации! Теперь все в порядке.
anotherMethod
изtestMethod
рассматривается как вызов бизнес-метода, поэтому перехватчики не применяются. См. github.com/cdi-spec/cdi-spec.org/blob/master/_faq/core/ для дальнейшего ознакомления и ссылки на спецификацию CDI. - person adrobisch   schedule 18.06.2014