我正在尝试为以下类创建单元测试:
@Secured
@Provider
@Priority(Priorities.AUTHORIZATION)
public class AuthorizationFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
@Context
private SecurityContext securityContext;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
// Get the resource class which matches with the requested URL
// Extract the permissions declared by it
Class<?> resourceClass = resourceInfo.getResourceClass();
List<Permission> classPermissions = extractPermissions(resourceClass);
// Get the resource method which matches with the requested URL
// Extract the permissions declared by it
Method resourceMethod = resourceInfo.getResourceMethod();
List<Permission> methodPermissions = extractPermissions(resourceMethod);
try {
String email = securityContext.getUserPrincipal().getName();
// Check if the user is allowed to execute the method
// The method annotations override the class annotations
if (methodPermissions.isEmpty()) {
checkPermissions(email, classPermissions);
} else {
checkPermissions(email, methodPermissions);
}
} catch (NotAuthorizedException e) {
requestContext.abortWith(
Response.status(Response.Status.FORBIDDEN).build());
}
}
// Extract the permissions from the annotated element
private List<Permission> extractPermissions(AnnotatedElement annotatedElement) {
// get permissions
return permissions;
}
protected void checkPermissions(String email, List<Permission> allowedPermissions) throws NotAuthorizedException {
Permissions permissions = DBUserUtils.getUserPermissions(email);
for (Permission permission : allowedPermissions){
if (!permissions.hasPermission(permission))
throw new NotAuthorizedException("Authorization header must be provided");;
}
}
}
我当前的测试类是:
@RunWith(MockitoJUnitRunner.class)
public class AuthorizationFilterTest {
@Mock
private ResourceInfo resourceInfo = mock(ResourceInfo.class);
@Mock
private SecurityContext securityContext = mock(SecurityContext.class);
@Mock
private static DBUserUtils dbUserUtils = mock(DBUserUtils.class);
@InjectMocks
private AuthorizationFilter authorizationFilter = spy(AuthorizationFilter.class);
private ContainerRequestContext requestContext = mock(ContainerRequestContext.class);
@Before
public void initMocks() {
MockitoAnnotations.initMocks(this);
doReturn(Endpoints.class).when(resourceInfo).getResourceClass();
when(securityContext.getUserPrincipal()).thenReturn(new UserPrincipal() {
@Override
public String getName() {
return "email";
}
});
}
@Test
public void authorizationFilterAuthorizedTest() throws NotAuthorizedException, IOException{
doReturn(getMethodByName(Endpoints.class, "createUser")).when(resourceInfo).getResourceMethod();
authorizationFilter.filter(requestContext);
verify(requestContext, times(0)).abortWith(any());
}
private Method getMethodByName(Class<?> classToUse, String methodName){
Method[] methods = classToUse.getMethods();
for (Method method : methods){
if (method.getName().equals(methodName))
return method;
}
return null;
}
}
我可以模拟类的私有字段,但似乎找不到模拟静态方法dbuserutils.getuserpermissions(email)
的方法。这是可能的还是我只是在浪费时间?
我使用Mockito1.10.19和JUnit4进行测试。
我是一个新的对象嘲弄单元测试,所以如果我有什么大错特错,请告诉我!
多谢了。
要在示例中模拟dbuserutils.getuserpermissions(email)
,您可以a)使用一些附加框架(例如。PowerMock,如对您问题的注释中所述),或b)将对dbuserutils.getuserpermissions(email)
的调用提取到单独的方法:
Permissions getUserPermissions(String email) {
return DBUserUtils.getUserPermissions(email);
}
然后可以在测试中进行模拟:
doReturn(...).when(authorizationFilter).getUserPermissions(any());
我是Google Guice的新手,从概念上理解依赖注入,但在尝试将其并入我的应用程序时遇到了一些问题。我的具体问题是关于单例对象的。这里有一个例子: 首先是我的模块类,它将一个沉重的单例连接接口绑定到它的实现。 现在,在我的main方法中,我实例化我的应用程序服务器并注入连接: 到目前为止一切顺利...现在,我有一些利用连接对象的DAO类,但使用静态方法检索,如下所示: 我的第一个假设是,我只需
问题内容: 我知道这看起来像是一个先前提出的问题,但是我在这里面临另一个问题。 我有一个只有静态方法的实用程序类。我不会,也不会从中获得实例。 现在我需要Spring用数据库属性Properties填充dataBaseAttr.Spring的配置是: 我已经在其他bean中做到了,但是此类(Utils)中的问题不是bean,如果我将其变成bean,则没有任何变化,但我仍然无法使用变量,因为该类不会
问题内容: 在我的一个班级中,有一个成员,我需要在!中设置该值 !也就是说,我们是否可以为此静态属性注入一个值? 问题答案: 是的,此链接上有一个示例http://planproof-fool.blogspot.com/2010/03/spring-setting-static- fields.html
问题内容: 如果我尝试,它始终为“ null”。所以我尝试了这个。 此代码有效。Sample.name设置正确。这是好方法吗?如果没有,还有什么更好的方法吗?以及如何做? 问题答案: 首先,非领域是邪恶的。由于某种原因,Spring不允许注入此类字段。 你的解决方法是有效的,甚至不需要字段就足够了。另一方面,请尝试以下操作: (与一起使用)。但是给你一些建设性的建议:用和代替 创建第二个类。
本文向大家介绍Oracle Listener 动态注册 与 静态注册,包括了Oracle Listener 动态注册 与 静态注册的使用技巧和注意事项,需要的朋友参考一下 一.什么是注册 注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。 在数据库服务器启动过程中,
问题内容: 我想知道用google guice注入实用程序方法是否是一种好的样式。 假设我们有一个Converter Utility类: 我的想法是使用guice将这个Utility像Singleton这样注入 建议使用guice构建的应用程序采用哪种方式? 问题答案: 这取决于您的方法的性质。 如果有的话 简单 确定性的(即不依赖于其他参数) 没有副作用 不太可能改变 等等 您可以将其保留为静态