Mi piacerebbe testare un controller di riposo Spring Boot
, che è protetto usando Spring security
, e utilizzare mazze al suo interno. Ho provato con Mockito, ma penso che qualsiasi strumento di derisione dovrebbe fare il trucco.Spring MockMVC, Spring security e Mockito
per abilitare la protezione della molla nel mio test, prima ho fatto come segue:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Main.class)
@TestPropertySource(value="classpath:application-test.properties")
@WebAppConfiguration
@ContextConfiguration
public class MyTest{
protected MockMvc mockMvc;
@Autowired
private WebApplicationContext wac;
@Before
public void setUp(){
mockMvc = MockMvcBuilders
.webAppContextSetup(wac)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
}
@Test
public void doTheTest(){
mockMvc.perform(post("/user/register")
.with(SecurityMockMvcRequestPostProcessors.csrf())
.content(someContent()));
}
}
Fino a quando non, funziona bene.
Dopo questo passaggio, ho voluto aggiungere dei mock per testare il mio controller protetto in isolamento.
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Main.class)
@TestPropertySource(value="classpath:application-test.properties")
@WebAppConfiguration
@ContextConfiguration
public class MyTest{
protected MockMvc mockMvc;
@Mock
private Myservice serviceInjectedInController;
@InjectMocks
private MyController myController;
@Autowired
private WebApplicationContext wac;
@Before
public void setUp(){
mockMvc = MockMvcBuilders
.webAppContextSetup(wac)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
}
@Test
public void doTheTest(){
mockMvc.perform(post("/user/register")
.with(SecurityMockMvcRequestPostProcessors.csrf())
.content(someContent()));
}
}
Purtroppo, il servizio deriso non viene iniettato nel controllore, in quanto non v'è nulla in relazione il MockMVC e Mocks, quindi i mock non vengono iniettati nel controllore.
Così ho provato a cambiare la configurazione del MockMVC, come segue:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Main.class)
@TestPropertySource(value="classpath:application-test.properties")
@WebAppConfiguration
@ContextConfiguration
public class MyTest{
protected MockMvc mockMvc;
@Mock
private Myservice serviceInjectedInController;
@InjectMocks
private MyController myController;
@Before
public void setUp(){
mockMvc = MockMvcBuilders
.standAloneSetup(myController)
.apply(SecurityMockMvcConfigurers.springSecurity())
.build();
}
@Test
public void doTheTest(){
mockMvc.perform(post("/user/register")
.with(SecurityMockMvcRequestPostProcessors.csrf())
.content(someContent()));
}
}
Ma in questo caso, ho un altro problema. sicurezza primavera si lamenta la configurazione:
java.lang.IllegalStateException: springSecurityFilterChain cannot be null. Ensure a Bean with the name springSecurityFilterChain implementing Filter is present or inject the Filter to be used.
ho altra idea per rendere la sicurezza e beffardo. Qualche idea? O dovrei fare un altro modo?
Grazie.
stai usando Primavera di sicurezza 4+ versione? – Ritesh
Sto usando Spring-boot 1.2.7.RELEASE e ho sostituito la sicurezza Spring predefinita per usare 4.0.2 –
@Remi Hai mai risolto questo? – hvgotcodes