Mockitoを使用して、@ NameBindingを使用して適用されるContainerRequestFilterのユニットテストを試みています。フィルタは、注釈フィールドをチェックして何をすべきかを決定します。 参照サンプルコード:ユニットテストContainerRequestFilter、ResourceInfoをmockitoで使用する
注釈
@Target({TYPE, METHOD})
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
MyEnum info() default MyEnum.DEFAULT;
}
MyEnum
public enum MyEnum {
VALUE1,
VALUE2,
DEFAULT
}
条件
@MyAnnotation
public class MyFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Override
public void filter(ContainerRequestContext containerRequestContext) throws IOException {
if (resourceInfo.getResourceMethod().getAnnotation(MyAnnotation.class).info().equals(MyEnum.VALUE1))
{
// set some value or throw some exception (this can be verified in the test)
}
if (resourceInfo.getResourceMethod().getAnnotation(MyAnnotation.class).info().equals(MyEnum.VALUE2))
{
// set some value or throw some exception (this can be verified in the test)
}
}
}
としてMyEnumを使用
注釈付きフィルタ 注釈付きのリソースメソッド
@Path("/somepath1")
public class MyResource1
{
@GET
@MyAnnotation(info = MyEnum.VALUE1)
public Response someResourceMethod()
{
// return response
}
}
@Path("/somepath2")
public class MyResource2
{
@GET
@MyAnnotation(info = MyEnum.VALUE2)
public Response someResourceMethod()
{
// return response
}
}
この設計では、フィルタに追加する新しい条件があるときだけ列挙値を追加することが容易になります。
ユニットテストMyFilter
は、条件式の値を変更することでどのようにすることができますか?
ResourceInfo
を模擬してとしたときに模擬Method
を返す試みがありましたが、これは最終的なクラスであるため実行できません。
あなたが所有していない模擬オブジェクトもお勧めできません。そのため、これをテストする別の方法がありますか?私はMockitoと結婚していないので、他の提案にも開放しています。
これは完全に機能します。私はGuiceを使用しており、 'MyFilter'コンストラクタに別の依存関係を注入する必要がありました。そのため、 'ResourceInfo'の' @ Context'アノテーションを使ってセッター注入を行いました。次に、テスト設定で、 'filter.setResourceInfo(resourceInfo)'を実行しました。 – bdeo