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

@Context对象在单元测试resteasy时未注入

岳奇逸
2023-03-14
@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();
    }
}
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());
    }
}

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

共有1个答案

洪景铄
2023-03-14

我根据这个答案找到了一个解决方案。

在我的LocaleProvider中,而不是

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

我需要用

 ResteasyProviderFactory.pushContext(Locale.class, locale);
 类似资料:
  • 所以我使用的是与JBoss捆绑在一起的RESTEasy。 类是: …最后,在类中,我有以下内容: 我的问题是: 为什么注射失败? 我有点厌倦了注释魔术在运行时失败,有没有一种方法可以不使用注释就获得? 或者,我的类是否可以获得并将其作为构造函数参数传递给类? 如果所有其他方法都失败了,我想我总是可以使用?自己读取和解析web.xml文件

  • 我有一个处理jwt创建的类: 并从resources文件夹中的属性文件中获取jwtSecret和jwtExpirationInMs。 我的单元测试如下所示:

  • 问题内容: 我知道关于模拟和测试有很多问题,但是我发现没有任何问题可以完美地帮助我,因此我仍然对理解以下内容有疑问: 如果我弄错了,请纠正我,但据我所知,单元测试用于隔离测试一个特定类的业务逻辑,并且如果有外部需要的任何对象,它们将被模拟。因此,例如,如果我有一个简单城市居民的管理系统,该系统将居民添加到列表中并按姓名返回居民(假设:居民仅包含一些基本个人信息),如下所示: 如果现在我要进行单元测

  • 我的“BBService”对象在这里为空 我是不是漏掉了什么?

  • 遇到了另一个常见的问题,同时为Spring Batch编写单元测试和集成测试组件是如何模拟域对象。一个很好的例子是StepExecutionListener,如下所示: public class NoWorkFoundStepExecutionListener extends StepExecutionListenerSupport { public ExitStatus afterSte