2
我正在尝试使用Mockito来单元测试使用@NameBinding应用的ContainerRequestFilter。筛选器检查注释字段以确定要执行的操作。 见示例代码:单元测试ContainerRequestFilter与mockito使用ResourceInfo
注释
@Target({TYPE, METHOD})
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
MyEnum info() default MyEnum.DEFAULT;
}
MyEnum
public enum MyEnum {
VALUE1,
VALUE2,
DEFAULT
}
注释过滤器,它使用MyEnum作为条件
@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)
}
}
}
注释资源的方法
@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
,然后在resourceInfo.getResourceMethod()
时返回模拟Method
,但由于Method是最终的类,因此无法完成此操作。
也不建议嘲笑你不拥有的对象,那么有没有不同的方法来测试它?我也不喜欢Mockito,所以对其他建议敞开心扉。
这工作完美。我正在使用Guice,并且必须在'MyFilter'构造函数中注入另一个依赖项。因此,对'ResourceInfo'的'@ Context'注释使用了setter注入。然后在测试设置中,做了'filter.setResourceInfo(resourceInfo)' – bdeo