junit5 + сварка + расширение для мокито - PullRequest
1 голос
/ 13 февраля 2020

Это мой ресурс REST:

@Context
HttpServletRequest webRequest;


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

Я собрал свой юнит-тест с расширением Junit 5 + Weld / Mockito.

@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?

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

У нас была эта проблема при попытке @Inject private Boolean securityEnabled; объектов, потому что логическое не может быть смоделировано. Мы решили это с помощью специального расширения JUnit / Mockito: https://github.com/exabrial/mockito-object-injection

 @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 HttpServletRequest и Context, а затем установив их на карте инъекций.

0 голосов
/ 04 марта 2020

После запроса помощи также для группы сварки-юнит, пользователь mkouba дал окончательное решение.

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();

Добавив наблюдателя в аннотацию Context , servletRequest макет правильно введен в ConfigApiResource

...