Welcome!

By registering with us, you'll be able to discuss, share and private message with other members of our community.

SignUp Now!
  • Guest, before posting your code please take these rules into consideration:
    • It is required to use our BBCode feature to display your code. While within the editor click < / > or >_ and place your code within the BB Code prompt. This helps others with finding a solution by making it easier to read and easier to copy.
    • You can also use markdown to share your code. When using markdown your code will be automatically converted to BBCode. For help with markdown check out the markdown guide.
    • Don't share a wall of code. All we want is the problem area, the code related to your issue.


    To learn more about how to use our BBCode feature, please click here.

    Thank you, Code Forum.

Java Spring Boot Microservices - Spring Security Issue in one service throwing throwing java.lang.StackOverflowError in JUnit

datdatyul

Active Coder
I have a problem in running any test method in service test and controller test in one of the spring boot microservices (order service).

After I completed service and controller , I tried to write their test methods but I have a problem in there.

How can I fix it?

Here is the security config of order service?

Code:
    @Configuration
    @EnableWebSecurity(debug = true)
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    @RequiredArgsConstructor
    public class SecurityConfig {
        //
        private final JwtAuthenticationEntryPoint authenticationEntryPoint;
        private final JWTAccessDeniedHandler accessDeniedHandler;
        private final JwtAuthenticationFilter jwtAuthenticationFilter;
    
    
        @Bean(BeanIds.AUTHENTICATION_MANAGER)
        public AuthenticationManager authenticationManager(final AuthenticationConfiguration authenticationConfiguration) throws Exception {
            return authenticationConfiguration.getAuthenticationManager();
        }
    
    
        @Bean
        public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            return http
                    .csrf().disable()
                    .authorizeRequests()
                    .antMatchers(HttpMethod.POST, "/order/**").hasRole("USER")
                    .antMatchers(HttpMethod.GET, "/order/**").hasRole("USER")
                    .and()
                    .authorizeRequests().anyRequest().authenticated()
                    .and()
                    .formLogin().disable()
                    .httpBasic().disable()
                    .exceptionHandling()
                    .authenticationEntryPoint(authenticationEntryPoint)
                    .accessDeniedHandler(accessDeniedHandler)
                    .and()
                    .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
                    .build();
        }
    
        @Bean
        public WebSecurityCustomizer webSecurityCustomizer() {
            return (web)
                    -> web.ignoring().antMatchers("/authenticate/signup", "/authenticate/login", "/authenticate/refreshtoken");
        }
    
    }

Here is one of the test method of OrderServiceTest shown below

Code:
    @DisplayName("Get Order - Success Scenario")
    @Test
    void test_When_Order_Success() {
        
        //Mocking
        Order order = getMockOrder();
        when(orderRepository.findById(anyLong()))
                    .thenReturn(Optional.of(order));
        
        when(restTemplate.getForObject(
                    "http://PRODUCT-SERVICE/product/" + order.getProductId(),
                    ProductResponse.class
        )).thenReturn(getMockProductResponse());
        
        when(restTemplate.getForObject(
                    "http://PAYMENT-SERVICE/payment/order/" + order.getId(),
                    PaymentResponse.class
        )).thenReturn(getMockPaymentResponse());
        
        //Actual
        OrderResponse orderResponse = orderService.getOrderDetails(1);
        
        //Verification
        verify(orderRepository, times(1)).findById(anyLong());
        verify(restTemplate, times(1)).getForObject(
                    "http://PRODUCT-SERVICE/product/" + order.getProductId(),
                    ProductResponse.class);
        verify(restTemplate, times(1)).getForObject(
                    "http://PAYMENT-SERVICE/payment/order/" + order.getId(),
                    PaymentResponse.class);
        
        //Assert
        assertNotNull(orderResponse);
        assertEquals(order.getId(), orderResponse.getOrderId());
    }

Here is one of the test method of OrderControllerTest shown below.

Code:
    @Test
    @DisplayName("Place Order -- Success Scenario")
    @WithMockUser(username = "User", authorities = { "ROLE_USER" })
    void test_When_placeOrder_DoPayment_Success() throws Exception {

        OrderRequest orderRequest = getMockOrderRequest();
        String jwt = getJWTTokenForRoleUser();

        MvcResult mvcResult
                = mockMvc.perform(MockMvcRequestBuilders.post("/order/placeorder")
                        .contentType(MediaType.APPLICATION_JSON_VALUE)
                        .header("Authorization", "Bearer " + jwt)
                        .content(objectMapper.writeValueAsString(orderRequest)))
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andReturn();

        String orderId = mvcResult.getResponse().getContentAsString();

        Optional<Order> order = orderRepository.findById(Long.valueOf(orderId));
        assertTrue(order.isPresent());

        Order o = order.get();
        assertEquals(Long.parseLong(orderId), o.getId());
        assertEquals("PLACED", o.getOrderStatus());
        assertEquals(orderRequest.getTotalAmount(), o.getAmount());
        assertEquals(orderRequest.getQuantity(), o.getQuantity());
    }

Here is the error when I run any method of service test and controller shown below.

Code:
    java.lang.StackOverflowError
        at java.base/java.lang.Throwable.getOurStackTrace(Throwable.java:861)
        at java.base/java.lang.Throwable.getStackTrace(Throwable.java:853)
        at ch.qos.logback.classic.spi.ThrowableProxy.<init>(ThrowableProxy.java:79)
        ...
        ...

I found this link but it didn't help me fix the issue.
I hope you can help me.

**To run the app,**

1 ) Run Service Registery (Eureka Server)

2 ) Run config server

3 ) Run zipkin and redis through these commands shown below on docker

docker run -d -p 9411:9411 openzipkin/zipkin
docker run -d --name redis -p 6379:6379 redis

4 ) Run api gateway

5 ) Run other services

Here is the repo : Link

Here is the **result of the service test** screenshot : Link

Here is the **result of the controller test** screenshot : Link
 

New Threads

Latest posts

Buy us a coffee!

Back
Top Bottom