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
ただし、これは仕様によるようです。今はすべて順調です。