So the reference documentation suggests
@BeforeEach
void setup( WebApplicationContext wac) {
this.mockMvc = MockMvcBuilders.webAppContextSetup( wac )
.apply( SecurityMockMvcConfigurers.springSecurity() )
.alwaysDo( print() )
.build();
}
why not do it as constructor injection instead? (I haven’t tried this, I’m just assuming it doesn’t immediately blow up)
@Autowired
MyControllerTest(
@NonNull WebApplicatonContext wac
) {
this.mockMvc = MockMvcBuilders.webAppContextSetup( wac )
.apply( SecurityMockMvcConfigurers.springSecurity() )
.alwaysDo( print() )
.build();
}
Advertisement
Answer
Whether you choose constructor injection, method injection, or field injection is a matter of taste when using JUnit Jupiter with the SpringExtension.
The example in the reference manual simply shows one way to do it using a @BeforeEach method since many people are familiar with performing test setup within a “before” method.
You can also set up your MockMvc instance within the test class constructor, and you can make your mockMvc field final if you like.
In this commit, I updated a test class in Spring’s own test suite to demonstrate some of these techniques in practice.
Please note that the test class constructor does not need to be annotated with @Autowired if it accepts a single argument that is compatible with ApplicationContext.