在RestEasy中模拟摘要认证

4
我正在使用RestEasy开发REST服务器,并在单元测试中使用模拟调度器(org.jboss.resteasy.mockMockDispatcherFactory)。我的服务需要摘要身份验证,我希望将其纳入我的测试范畴。
我的每个服务都接受一个@Context SecurityContext securityContext参数。
是否有办法在调度程序中注入一个虚假的SecurityContext,以便我可以测试我的安全方法是否正常运行?
2个回答

3
你需要将SecurityContext添加到ResteasyProviderFactory的上下文数据映射中。
public class SecurityContextTest  {

    @Path("/")
    public static class Service {
        @Context
        SecurityContext context;

        @GET
        public String get(){
            return context.getAuthenticationScheme();
        }
    }

    public static class FakeSecurityContext extends ServletSecurityContext {

        public FakeSecurityContext() {
            super(null);
        }

        @Override
        public String getAuthenticationScheme() {
            return "unit-test-scheme";
        }
    }

    @Test
    public void securityContextTest() throws Exception {
        Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();
        dispatcher.getRegistry().addSingletonResource(new Service());
        ResteasyProviderFactory.getContextDataMap().put(SecurityContext.class, new FakeSecurityContext());

        MockHttpRequest request = MockHttpRequest.get("/");
        MockHttpResponse response = new MockHttpResponse();

        dispatcher.invoke(request, response);

        assertEquals("unit-test-scheme", response.getContentAsString());
    }
}

0
对于今天遇到这个问题的人来说,添加上下文已经从RestEasyProviderFactory类移动到Dispatcher类中,使用getDefaultContextObjects()方法。
我已经编辑了旧答案并加入了新的调用。
public class SecurityContextTest  {

    @Path("/")
    public static class Service {
        @Context
        SecurityContext context;

        @GET
        public String get(){
            return context.getAuthenticationScheme();
        }
    }

    public static class FakeSecurityContext extends ServletSecurityContext {

        public FakeSecurityContext() {
            super(null);
        }

        @Override
        public String getAuthenticationScheme() {
            return "unit-test-scheme";
        }
    }

    @Test
    public void securityContextTest() throws Exception {
        Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();
        dispatcher.getRegistry().addSingletonResource(new Service());
        dispatcher.getDefaultContextObjects().put(SecurityContext.class, new FakeSecurityContext());

        MockHttpRequest request = MockHttpRequest.get("/");
        MockHttpResponse response = new MockHttpResponse();

        dispatcher.invoke(request, response);

        assertEquals("unit-test-scheme", response.getContentAsString());
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接