Spring MockMVC,Spring安全性和Mockito

我想测试一个Spring BootRest控制器,该控制器使用进行保护Spring

security,并在其中使用模拟程序。我已经尝试过Mockito,但我认为任何模拟工具都可以解决问题。

为了在测试中启用Spring安全性,我首先做了如下工作:

@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()));

}

}

到那为止,它运作良好。

完成此步骤后,我希望添加模拟以隔离测试我的安全控制器。

@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()));

}

}

但是在这种情况下,我还有另一个问题。Spring Security抱怨配置:

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.

我没有其他想法可以进行安全性和嘲弄。任何的想法?还是我应该采取其他方式?

谢谢。

回答:

默认情况下,集成会查找名称为“

springSecurityFilterChain”的bean。在提供的示例中,使用的是独立安装程序,这意味着MockMvc将不会WebApplicationContext在测试中知道所提供的内容,因此将无法查找“

springSecurityFilterChain” bean。

解决此问题的最简单方法是使用如下代码:

    MockMvc mockMvc = MockMvcBuilders

// replace standaloneSetup with line below

.webAppContextSetup(wac)

.alwaysDo(print())

.apply(SecurityMockMvcConfigurers.springSecurity())

.build();

如果您真的想使用standaloneSetup(因为已经有了WebApplicationContext并没有什么意义),则可以使用以下命令显式提供springSecurityFilterChain:

@Autowired

FilterChainProxy springSecurityFilterChain;

@Before

public void startMocks(){

controller = wac.getBean(RecipesController.class);

MockMvc mockMvc = MockMvcBuilders

.standaloneSetup(controller)

.alwaysDo(print())

.apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))

.build();

MockitoAnnotations.initMocks(this);

}

以上是 Spring MockMVC,Spring安全性和Mockito 的全部内容, 来源链接: utcz.com/qa/406012.html

回到顶部