Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Avoid proliferation of @MockBeans in Spring Boot @WebMvcTest test

I have a simple controller e.g.

@Controller
public class FooController
{
    @Autowired
    private BarService barService;

    @RequestMapping(value = "/foo", method = RequestMethod.GET)
    public String displayFoo()
    {
        return "foo";
    }
}

When I want to do a @WebMvcTest, I have to create a great number of @MockBeans to prevent a NoSuchBeanDefinitionException.

@RunWith(SpringRunner.class)
@WebMvcTest
@Import(WebSecurityConfig.class)
public class FooControllerTest
{
    @MockBean ...
    @MockBean ...
    @MockBean ...
    ...
    ...
}

Does this mean that BarService is somehow creating a chain of dependencies? (it has some dependencies but some @MockBeans appear completely unrelated).

The problem is, is that each @WebMvcTest I add for different controllers also requires the same @MockBeans.

Should I be using an annotation like @TestConfiguration to specify all the @MockBeans for the DRY principal?


2 Answers

I looked at this again, and found you can pass the controller name to @WebMvcTest e.g. @WebMvcTest(FooController.class).

Specifies the controllers to test. May be left blank if all {@code @Controller} beans should be added to the application context.

As Hal8k said, if you don't specify a controller like @WebMvcTest(YourController.class), it will try to load all @Controller components. And @Import(WebSecurityConfig.class) also try to inject components in WebSecurityConfig.class.

Refer : https://spring.io/blog/2016/08/30/custom-test-slice-with-spring-boot-1-4

like image 44
Min Hyoung Hong Avatar answered Oct 25 '25 15:10

Min Hyoung Hong