大家好,今天为大家介绍一下springboot在web中的测试,希望大家喜欢
第一步:配置依赖工程
Gradle中需要以下testCompile依赖:
testCompile(“org.springframework.security:spring-security-test”)

Maven中,则添加以下依赖:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
第二步:创建MockMvc实例
应用程序的Classpath里有了Spring Security的测试模块之后,只需在创建MockMvc实例时运用Spring Security的配置器。
@Before
public void setupMockMvc() {
mockMvc = MockMvcBuilders
.webAppContextSetup(webContext)
.apply(springSecurity())
.build();
}
springSecurity()方法返回了一个Mock MVC配置器,为Mock MVC开启了Spring Security支持。只需像上面这样运用就行了,Spring Security会介入MockMvc上执行的每个请求。具体的安全配置取决于你如何配置Spring Security(或者Spring Boot如何自动配置Spring Security)。springSecurity()方法是SecurityMockMvcConfigurers的一个静态方法,考虑到可读性,我已经将其静态导入。
第三步:编写身份安全校验逻辑
开启了Spring Security之后,在请求主页的时候,我们便不能只期待HTTP 200响应。如果请求未经身份验证,我们应该期待重定向到登录页面:
@Test
public void homePage_unauthenticatedUser() throws Exception {
mockMvc.perform(get(“/”))
.andExpect(status()。is3xxRedirection())
.andExpect(header()。string(“Location”,
“http://localhost/login”));
}
不过,经过身份验证的请求又该如何发起呢?Spring Security提供了两个注解。
@WithMockUser:加载安全上下文,其中包含一个UserDetails,使用了给定的用户名、密码和授权。
@WithUserDetails:根据给定的用户名查找UserDetails对象,加载安全上下文。
在这两种情况下,Spring Security的安全上下文都会加载一个UserDetails对象,添加了该注解的测试方法在运行过程中都会使用该对象。@WithMockUser注解是两者里比较基础的那个,许显式声明一个UserDetails,并加载到安全上下文。
@Test
@WithMockUser(username=“craig”,password=“password”,roles=“READER”)
public void homePage_authenticatedUser() throws Exception {
…
}
如你所见,@WithMockUser绕过了对UserDetails对象的正常查询,用给定的值创建了一个UserDetails对象取而代之。在简单的测试里,这就够用了。但我们的测试需要Reader(实现了UserDetails ) 而非@WithMockUser 创建的通用UserDetails .为此, 我们需要@WithUserDetails.@WithUserDetails注解使用事先配置好的UserDetailsService来加载UserDetails对象。代码如下:
@Test
@WithUserDetails(“craig”)
public void homePage_authenticatedUser() throws Exception {
Reader expectedReader = new Reader();
expectedReader.setUsername(“craig”);
expectedReader.setPassword(“password”);
expectedReader.setFullname(“Craig Walls”);
mockMvc.perform(get(“/”))
.andExpect(status()。isOk())
.andExpect(view()。name(“readingList”))
.andExpect(model()。attribute(“reader”,
samePropertyValuesAs(expectedReader)))
.andExpect(model()。attribute(“books”, hasSize(0)))
}
我们通过@WithUserDetails注解声明要在测试方法执行过程中向安全上下文里加载craig用户。Reader会放入模型,该测试方法先创建了一个期望的Reader对象,后续可以用来进行比较。山东it培训告诉我们,随后GET请求发起,也有了针对视图名和模型内容的断言,其中包括名为reader的模型属性。同样,此处没有启动Servlet容器来运行这些测试,Spring的Mock MVC取代了实际的Servlet容器。这样做的好处是测试方法运行相对较快。因为不需要等待服务器启动,而且不需要打开Web浏览器发送表单,所以测试比较简单快捷。不过,这并不是一个完整的测试。它比直接调用控制器方法要好,但它并没有真的在Web浏览器里执行应用程序,验证呈现出的视图。为此,我们需要启动一个真正的Web服务器,用真实浏览器来访问它。让我们来看看Spring Boot如何启动一个真实的Web服务器来帮助测试。
希望对您有所帮助
更多山东it培训相关资讯,请扫描下方二维码