Я хотел бы протестировать Spring Boot
Контроллер отдыха, который защищен с помощью Spring security
и использовать в нем издевательства. Я пытался с Mockito, но я думаю, что любой из насмешливый инструмент должен сделать трюк.Весна MockMVC, Весна безопасности и Mockito
Чтобы включить Spring Security в моих тестах, я первым сделал следующим образом:
@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()));
}
}
До тех пор, пока он работает хорошо.
После этого шага, я хотел добавить mocks для проверки моего защищенного контроллера изолированно.
@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()));
}
}
К сожалению, издевались служба не впрыскивается в контроллере, так как нет ничего, связывающее MockMVC и Mocks, поэтому издевается не вводят в контроллер.
Так что я попытался изменить конфигурацию MockMVC следующим образом:
@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()));
}
}
Но в этом случае, у меня есть еще один вопрос. Весна безопасности жалуется на конфигурацию:
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.
У меня нет другой идеи, чтобы сделать безопасность и насмешливость. Есть идеи? Или я должен делать другой путь?
Спасибо.
вы используете Spring Security 4+ версию? – Ritesh
Я использую Spring-boot 1.2.7.RELEASE, и у меня есть переопределенная безопасность по умолчанию Spring для использования 4.0.2 –
@Remi Вы когда-нибудь это разрешили? – hvgotcodes