Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SpringBoot Junit testing for filters in Zuul

I'm new to Zuul J-unit testing. I have a couple of filters which is ChangeRequestEntityFilter and SessionFilter, Where I pasted my filtercode below. Can someone tell me how to write a Junit for the filter. I've searched and trying to use MockWire for the unit testing(Also I pasted my empty methods with basic annotations and WireMock port). I need at-least one proper example how this J-unit for Zuul works. I've referred the http://wiremock.org/docs/getting-started/ doc. Where I got what to do, but not how to do.

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;
    }

}

I know ,I'm asking more. But give me any simple working complete example, I'm fine with it.

My current code with basic annotations and WireMock port.

@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() {

    }
}
like image 285
JavaCodder Avatar asked Oct 27 '25 09:10

JavaCodder


2 Answers

Have you tried @MockBean?

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

"When @MockBean is used on a field, as well as being registered in the application context, the mock will also be injected into the field. Typical usage might be:"

@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 {
     }

}
like image 73
Fabio Manzano Avatar answered Oct 30 '25 13:10

Fabio Manzano


Here there is another approach:

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

In this case you can test the filter and mock the services inside it without having to autowire it, the problem with the @autowired is that if you have services inside the filter, then it is going to be an integration test that is going to be more difficult to implement.

like image 24
William Andrés Bernal Avatar answered Oct 30 '25 15:10

William Andrés Bernal