首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >junit5 +焊缝+ mockito扩展,如何注入@Context对象

junit5 +焊缝+ mockito扩展,如何注入@Context对象
EN

Stack Overflow用户
提问于 2020-02-13 11:03:59
回答 2查看 1.1K关注 0票数 1

这是我的休息资源:

代码语言:javascript
复制
@Context
HttpServletRequest webRequest;


@Override
public DomainConfig get() {
    return configDelegate.get(webRequest.getHeader("Origin"));
}

我用Junit 5+ Weld / Mockito扩展构建了我的单元测试。

代码语言:javascript
复制
@MockitoSettings(strictness = Strictness.STRICT_STUBS)
@ExtendWith(MockitoExtension.class)
@DisplayName("configs resource")
@EnableWeld
public class ConfigApiResourceTest {

    @Mock
    HttpServletRequest servletRequest;

    @WeldSetup
    public WeldInitiator weld = WeldInitiator
            .from(
                    MockCommonResources.class,
                    ConfigApiResource.class,
                    ConfigDelegate.class,
                    ConfigService.class,
                    etc etc
            )
            .addBeans(createHttpServletRequest())
            .activate(
                    RequestScoped.class,
                    ApplicationScoped.class
            )
            .build();

    Bean<?> createHttpServletRequest() {
        return MockBean.builder()
                .types(HttpServletRequest.class)
                .create(o -> servletRequest)
                .build();
    }

    @Test
    @DisplayName("config")
    void config(ConfigApiResource configApiResource) {

        final String url = "areaclient.infocert.it";

        when(servletRequest.getHeader("Origin")).thenReturn(url);

        final DomainConfig output = configApiResource.get();
        assertNotNull(output);

    }
}

问题是HttpServletRequest webRequest总是null,可能是因为没有注入,但它是上下文对象。

因此,真正的问题是,我如何生成一个HttpServletRequest模拟并作为@Context对象注入?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-04 09:49:09

用户mkouba在向焊接单元组请求帮助后,给出了最终解决方案。

代码语言:javascript
复制
final Weld weldBase = WeldInitiator.createWeld()
            .addBeanClasses(
                    MockCommonResources.class,
                    ConfigApiResource.class,
                    ConfigDelegate.class,
                    ConfigService.class,
                    etc etc
            )
            .addContainerLifecycleObserver(ContainerLifecycleObserver.processAnnotatedType()
                    .notify(pat -> pat.configureAnnotatedType()
                            .filterFields(m -> m.isAnnotationPresent(Context.class))
                            .forEach(m -> m.add(javax.enterprise.inject.literal.InjectLiteral.INSTANCE))));


    @WeldSetup
    public WeldInitiator weld = WeldInitiator
            .from(
                    weldBase
            )
            .activate(
                    RequestScoped.class,
                    ApplicationScoped.class
            )
            .addBeans(createHttpServletRequest())
            .build();

通过在ConfigApiResource上下文注释上添加观察者,servletRequest模拟将正确地注入到中。

票数 2
EN

Stack Overflow用户

发布于 2020-02-13 17:23:06

我们在尝试@Inject private Boolean securityEnabled;对象时遇到了这个问题,因为布尔值不能被模拟。我们用一个定制的JUnit/Mockito扩展来解决它:https://github.com/exabrial/mockito-object-injection

代码语言:javascript
复制
 @InjectionMap
 private Map<String, Object> injectionMap = new HashMap<>();

 @BeforeEach
 public void beforeEach() throws Exception {
  injectionMap.put("securityEnabled", Boolean.TRUE);
 }

 @AfterEach
 public void afterEach() throws Exception {
  injectionMap.clear();
 }

您可以通过@Mock、ing、HttpServletRequestContext进行同样的操作,然后在注入映射中设置它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60206321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档