Search code examples
microserviceszuul-testing

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

    }
}

Solution

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