当前位置: 首页 > 知识库问答 >
问题:

Java Mockito注入一个静态类

茅曾琪
2023-03-14

我正在尝试为以下类创建单元测试:

@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进行测试。

我是一个新的对象嘲弄单元测试,所以如果我有什么大错特错,请告诉我!

多谢了。

共有1个答案

袁翔
2023-03-14

要在示例中模拟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构建的应用程序采用哪种方式? 问题答案: 这取决于您的方法的性质。 如果有的话 简单 确定性的(即不依赖于其他参数) 没有副作用 不太可能改变 等等 您可以将其保留为静态