Тестирование SpringBoot Junit для фильтров в Zuul

Я новичок в тестировании J-юнитов Zuul. У меня есть несколько фильтров, которые являются ChangeRequestEntityFilter и SessionFilter, куда я вставил свой код фильтра ниже. Может кто-нибудь сказать мне, как написать Junit для фильтра. Я искал и пытался использовать MockWire для модульного тестирования (также я вставил свои пустые методы с основными аннотациями и портом WireMock). Мне нужен хотя бы один подходящий пример того, как работает этот J-модуль для Zuul. Я сослался на http://wiremock.org/docs/getting-started/ doc. Где я получил, что делать, но не как это сделать.

public class ChangeRequestEntityFilter extends ZuulFilter {

    @Autowired
    private UtilityHelperBean utilityHelperBean;

    @Override
    public boolean shouldFilter() {
        // //avoid http GET request since it does'nt have any request body
        return utilityHelperBean.isValidContentBody();
    }

    @Override
    public int filterOrder() {
        //given priority
    }

    @Override
    public String filterType() {
        // Pre
    }

    @Override
    public Object run() {

        RequestContext context = getCurrentContext();

        try {
            /** get values profile details from session */
            Map<String, Object> profileMap = utilityHelperBean.getValuesFromSession(context,
                    CommonConstant.PROFILE.value());

            if (profileMap != null) {
                /** get new attributes need to add to the actual origin microservice request payload */
                Map<String, Object> profileAttributeMap = utilityHelperBean.getProfileForRequest(context, profileMap);
                /** add the new attributes in to the current request payload */
                context.setRequest(new CustomHttpServletRequestWrapper(context.getRequest(), profileAttributeMap));
            }

        } catch (Exception ex) {
            ReflectionUtils.rethrowRuntimeException(new IllegalStateException("ChangeRequestEntityFilter : ", ex));
        }

        return null;
    }

}

Я знаю, я спрашиваю больше. Но приведите мне простой простой рабочий пример, я в порядке.

Мой текущий код с основными аннотациями и портом WireMock.

@RunWith(SpringRunner.class)
@SpringBootTest
@DirtiesContext
@EnableZuulProxy
public class ChangeRequestEntityFilterTest {

    @Rule
    public WireMockRule wireMockRule = new WireMockRule(8080);

    @Mock
    ChangeRequestEntityFilter requestEntityFilter;

    int port = wireMockRule.port();

    @Test
    public void changeRequestTest() {

    }
}

1 ответ

Решение

Вы пробовали @MockBean?

https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/test/mock/mockito/MockBean.html

"Когда @MockBean используется в поле, а также зарегистрирован в контексте приложения, макет также будет вставлен в поле. Типичное использование может быть:"

@RunWith(SpringRunner.class)
public class ExampleTests {

     @MockBean
     private ExampleService service;

     @Autowired
     private UserOfService userOfService;

     @Test
     public void testUserOfService() {
         given(this.service.greet()).willReturn("Hello");
         String actual = this.userOfService.makeUse();
         assertEquals("Was: Hello", actual);
     }

     @Configuration
     @Import(UserOfService.class) // A @Component injected with ExampleService
     static class Config {
     }

}

Здесь есть другой подход:

    private ZuulPostFilter zuulPostFilter;

    @Mock
    private anotherService anotherService;

    @Mock
    private HttpServletRequest request;

    @Before
    public void before() {
        MockitoAnnotations.initMocks(this);
        MonitoringHelper.initMocks();
        zuulPostFilter = new ZuulPostFilter(anotherService);
        doNothing().when(anotherService).saveInformation(null, false);
    }

    @Test
    public void postFilterTest() {
        log.info("postFilterTest");
        RequestContext context = new RequestContext();
        context.setResponseDataStream(new ByteArrayInputStream("Test Stream".getBytes()));
        context.setResponseGZipped(false);
        RequestContext.testSetCurrentContext(context);
        when(request.getScheme()).thenReturn("HTTP");
        RequestContext.getCurrentContext().setRequest(request);

        ZuulFilterResult result = zuulPostFilter.runFilter();

        assertEquals(ExecutionStatus.SUCCESS, result.getStatus());
        assertEquals("post", zuulPostFilter.filterType());
        assertEquals(10, zuulPostFilter.filterOrder());
    }

В этом случае вы можете протестировать фильтр и смоделировать сервисы внутри него без необходимости его автоматического подключения, проблема с @autowired заключается в том, что если у вас есть сервисы внутри фильтра, то это будет интеграционный тест, который будет сложнее реализовать.

Другие вопросы по тегам