1. 背景
因为要做一个Java hook相关的东西,需要用到SpingBoot,作为自己的测试目标。可是,之前没有接触过啊!!在网上搜搜资料,现学现卖吧。
2. SpringBoot项目快速搭建
2.1 简单的框架程序
(a)在http://start.spring.io/上可以快速构建一个Spring Boot框架程序,并下载到本地;
(b)本地用IDEA直接导入下载的本地程序;
(c)spingboot建议的目录结果如下:
假设root package为:com.example.myproject
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- controller
| +- CustomerController.java
|
其中,各自目录的作用如下:
1、Application.java 建议放到跟目录下面,主要用于做一些框架配置
2、domain目录主要用于实体(Entity)与数据访问层(Repository)
3、service 层主要是业务类代码
4、controller 负责页面访问控制
在默认配置下,一个简单Spring Boot程序就完工了。
2.2 引入web模块
上面的程序很简单,可以说几乎什么功能都没有。而我们需要引入web功能,该怎么办,也很简单。
1、先在pom.xml中增加web模块的依赖支持
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
pom.xml文件中默认有两个模块:
spring-boot-starter:核心模块,包括自动配置支持、日志和YAML;
spring-boot-starter-test:测试模块,包括JUnit、Hamcrest、Mockito。
2、添加一个controller
@RestController
public class HelloWorldController {
@RequestMapping("/hello")
public String processHello() {
return "Hello Spring Boot!";
}
}
@RestController的意思就是controller里面的方法都以json格式输出,不用再写什么jackjson配置的了!
@RequestMapping的作用是将请求的路径和相应的处理函数映射起来。
3、启动主程序,打开浏览器访问http://localhost:8080/hello,就可以看到效果了!
3. SpringBoot框架下的单元测试
用UT来做触发程序,要比每次通过client去访问URL要方便很多。至于如何增加UT的code,也很简单。
对需要增加UT的class,直接在class name上右键"goto"->“test”,如果没有对于的test文件,可以自行创建;如果有,则会跳转到对于的teat文件。真是异常简单啊~
编写简单的http请求来测试,使用mockmvc进行,利用MockMvcResultHandlers.print()打印出执行结果。
@RunWith(SpringRunner.class)
@SpringBootTest
class HelloWorldControllerTest {
private MockMvc mvc;
@BeforeEach
void setUp() {
System.out.println("[HelloWorldControllerTest] setup");
mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();
}
@AfterEach
void tearDown() {
System.out.println("[HelloWorldControllerTest] tear down");
}
@Test
void processHello() throws Exception {
System.out.println("[HelloWorldControllerTest] index hello");
mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
}
}
在IDEA中,如果想执行所有的UT,直接在UT的顶层package上执行即可。