【问题标题】:Unit Tests for Authenticated Resources in Dropwizard 0.8.0Dropwizard 0.8.0 中已验证资源的单元测试
【发布时间】:2015-02-15 19:53:50
【问题描述】:

我想在 Dropwizard 0.8.0-rc2 应用程序中测试我的 Jersey 资源。另一个障碍是我使用 TestNG 而不是 JUnit,所以我必须手动做一些我从 DropwizardClientRule 复制的东西。

现在我有一些由@Auth 保护的资源。在 Dropwizard 0.7.1 中,我将验证器添加到测试应用程序中,如下所示:

DropwizardResourceConfig resourceConfig = DropwizardResourceConfig.forTesting(…);        
Authenticator<BasicCredentials, Identity> authenticator =
        credentials -> getAuthorizedIdentity();
resourceConfig.getSingletons().add(
        new BasicAuthProvider<>(authenticator, "TEST"));

在这里,getAuthorizedIdentity() 将获取一些测试授权。这将被传递给@Auth 带注释的注入参数。当然,现在有了 Jersey 2,情况发生了一些变化。我试过了:

DropwizardResourceConfig resourceConfig = DropwizardResourceConfig.forTesting(…);
Authenticator<BasicCredentials, Identity> authenticator =
        credentials -> getAuthorizedIdentity();
resourceConfig.register(AuthFactory.binder(
        new BasicAuthFactory<>(authenticator, "TEST", Identity.class)));

效果是我在所有受保护的资源上都得到 401。调试表明我的身份验证函数根本没有被调用!如果我删除注册,那么我就不会再得到401了(所以注册不是没有效果的),但是现在受保护的资源是不安全的,并为@Auth注解的参数获取null

那么,如何将身份验证器添加到测试上下文中才能正常工作?生产代码几乎可以在同一行上正常工作。

【问题讨论】:

  • 您在这个问题上有什么进展吗?我遇到了同样的障碍。

标签: java unit-testing authentication jersey-2.0 dropwizard


【解决方案1】:

此问题最近已修复。

https://github.com/dropwizard/dropwizard/pull/966

【讨论】:

  • 那里的讨论看起来和我的问题一模一样,谢谢。但是,快速测试并没有显示出任何改进,我现在没有时间深入研究它。
【解决方案2】:

我也遇到了同样的问题,在查看了 dropwizard-auth 项目中的测试后,我来到了这个解决方案,希望对您有所帮助。

public class ExamplesResourceTest extends JerseyTest
{
    @Override
    protected TestContainerFactory getTestContainerFactory()
        throws TestContainerException {
        return new GrizzlyWebTestContainerFactory();
    }

    @Override
    protected DeploymentContext configureDeployment() {
        return ServletDeploymentContext.builder(new ExampleTestResourceConfig())
            .initParam( ServletProperties.JAXRS_APPLICATION_CLASS, ExampleTestResourceConfig.class.getName() )
            .initParam( ServerProperties.PROVIDER_CLASSNAMES, ExampleResource.class.getName() )
            .build();
    }


    public static class ExampleTestResourceConfig extends DropwizardResourceConfig {

        private ObjectMapper mapper = Jackson.newObjectMapper();
        private Validator validator = Validation.buildDefaultValidatorFactory().getValidator();

        public ExampleTestResourceConfig() {
            super(true, new MetricRegistry());
            register( new JacksonMessageBodyProvider( mapper, validator ) );
            register( AuthFactory.binder( new BasicAuthFactory<>( new ExampleAuthenticator(), "realm", String.class ) ) );
        }
    }

    @Test
    public void exampleTest() throws AuthenticationException
    {
        Response response = target( "/api/example" )
            .request( MediaType.APPLICATION_JSON )
            .header( HttpHeaders.AUTHORIZATION, "Basic QmlsYm86VGhlU2hpcmU=" )
            .get();

        assertThat( response.getStatus() ).isEqualTo( 200 );
    }
}

【讨论】:

  • 运气不好,我的身份验证器没有被调用。与此同时,我找到了一种解决方法,它至少可以让我测试经过身份验证的资源;但不是身份验证本身。在这里发帖太脏了。
猜你喜欢
  • 1970-01-01
  • 2015-03-28
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 2015-07-10
  • 2014-08-21
相关资源
最近更新 更多