java - 单元测试resteasy时未注入(inject)@Context对象

标签 java unit-testing jboss jax-rs resteasy

我正在尝试注册一个 @Provider,它将 Locale 对象注入(inject)到 @Context 中,以便我可以在我的 REST 资源中重用它。

关注文章http://bill.burkecentral.com/2011/03/09/adding-objects-that-are-context-injectable/我设法让提供商运行

@Provider
public class LocaleProvider implements ContainerRequestFilter {

    public static final String DEFAULT_LANGUAGE_CODE_VALUE = "en-US";

    @Context
    Dispatcher dispatcher;

    @Override
    public void filter(ContainerRequestContext containerRequestContext) throws IOException {
        List<Locale> acceptableLanguages = containerRequestContext.getAcceptableLanguages();
        if (acceptableLanguages == null || acceptableLanguages.isEmpty()) {
(A)         dispatcher.getDefaultContextObjects().put(Locale.class, new Locale(DEFAULT_LANGUAGE_CODE_VALUE));
            return;
        }

        dispatcher.getDefaultContextObjects().put(Locale.class, acceptableLanguages.get(0));
    }


}

然后像这样使用它

@Path("/")
public class Resource {

    @GET
    public String get(@Context Locale locale) {
        if (locale == null) {
            return "null";
        }

        return locale.getLanguage();
    }
}

到目前为止,代码在部署到 Tomcat 时运行良好。但是当我尝试对其进行单元测试时,我遇到了问题。我有

public class LocaleProviderTest {
    private Dispatcher dispatcher = MockDispatcherFactory.createDispatcher();

    {
        dispatcher.getRegistry().addResourceFactory(new POJOResourceFactory(Resource.class));
    }

    @Test
    public void shouldHaveDefaultLocaleWhenNoAcceptLanguageHeader() throws URISyntaxException {
        dispatcher.getProviderFactory().registerProvider(LocaleProvider.class);

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

        assertEquals("en", response.getContentAsString());
    }
}

如果我调试它,即使 LocaleProvider 执行 (A) 行,Resource 也会返回 null

知道为什么 @Context 注入(inject)在单元测试时不起作用吗?

最佳答案

我找到了一个基于 this answer 的解决方案.

在我的 LocaleProvider 而不是

 dispatcher.getDefaultContextObjects().put(Locale.class, locale);

我需要使用

 ResteasyProviderFactory.pushContext(Locale.class, locale);

希望对大家有帮助:)

关于java - 单元测试resteasy时未注入(inject)@Context对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28938424/

相关文章:

java - 如何使用 Java 从流中分割字符串

java - 从命令行传递参数编译java程序

Java String.valueOf 返回空字符串

java - 如何模拟DynamoDB批量保存?

node.js - 使用来自 WebPack.DefinePlugin 的全局注入(inject)变量进行 NodeJS Mocha 单元测试

AngularJS karma Jasmine 错误: Cannot Read Property of Undefined

java - 如何从另一台计算机访问 WildFly 12 服务器上的 Web 应用程序?

Java JBoss fatal error : cannot find the required native library named JLinkNativeLibrary

apache - 502 Bad Gateway...来自上游服务器的无效响应(apache 和 jboss)

java - 如何防止 Gradle 将资源文件包含在 JAR 中