Ich möchte einen Spring Boot
Rest Controller, der mit Spring security
gesichert ist, testen und Mocks darin verwenden. Ich habe es mit Mockito versucht, aber ich denke, jedes Spottwerkzeug sollte den Trick machen.Spring MockMVC, Spring security und Mockito
Frühlings- und Sicherheit in meinen Tests zu ermöglichen, habe ich zuerst wie folgt:
@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()));
}
}
Bis da, es funktioniert gut.
Nach diesem Schritt wollte ich Mocks hinzufügen, um meinen gesicherten Controller isoliert zu testen.
@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()));
}
}
Leider ist der verspottete Dienst in der Steuerung nicht gespritzt, so gibt es nichts, das MockMVC und die Mocks beziehen, so dass die Mocks sind nicht in der Steuerung injiziert. So
Ich habe versucht, die Konfiguration des MockMVC ändern, wie folgt:
@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()));
}
}
Aber in diesem Fall habe ich ein anderes Problem. Frühlingssicherheit beschwert sich über die Konfiguration:
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.
Ich habe keine andere Idee, Sicherheit und Mocking zu machen. Irgendeine Idee? Oder sollte ich einen anderen Weg gehen?
Danke.
verwenden Sie Spring Security 4+ Version? – Ritesh
Ich benutze Spring-Boot 1.2.7.RELEASE und ich habe Standard-Spring-Sicherheit überschrieben, um 4.0.2 –
@Remi zu verwenden Haben Sie das jemals gelöst? – hvgotcodes