1 Spring Boot 的单元测试
Spring Boot 提供了@SpringBootTest 注解来辅助我们进行测试。
示例
首先我们先引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
然后创建一个 service 并将其实现
public interface HelloService {
void hello();
}
@Service
public class HelloServiceImpl implements HelloService{
@Override
public void hello() {
System.out.println("HELLO");
}
}
然后我们实现一个测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestApplication.class})
public class MyTest {
@Autowired
HelloService helloService;
@Test
public void test() {
helloService.hello();
System.out.println("my first test");
}
}
结果如下
使用 mock 方式进行 controller 单元测试
实际上,使用 @SpringBootTest 不会真正启动 web 服务,那我们应该如何测试 controller 单元呢?其实 Spring 已经提供了MockMvc 以供我们测试 controller 单元,快来体验一下吧!
我们有一个 controller
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "hello everybody!";
}
}
实现测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestApplication.class})
@AutoConfigureMockMvc
public class MyTest {
@Autowired
private MockMvc mvc;
@Test
public void test() throws Exception {
this.mvc.perform(get("/hello")).andExpect(status().isOk())
.andDo(MockMvcResultHandlers.print());
}
}
发现该请求成功通过
2 Spring Boot 中的日志管理
Spring Boot 的默认配置提供了对常用日志的支持。在默认情况下,Spring Boot 会用 SLF4J + Logback来记录日志,并用 INFO 级别输出到控制台。
SLF4J 是一个日志门面,也可以看作一个接口框架,并不提供具体的实现,具体的实现由类似于 Log4j,Log4j2,Logback 等等这样的日志框架去完成。
日志管理是有依赖的
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
根据我们之前的经验,是不是要把这个依赖加入 pom.xml 中呢?其实是不用的,因为 spring-boot-starter 已经包括了spring-boot-starter-logging。
下面我们通过代码进行示例:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestApplication.class})
public class MyTest {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Test
public void test(){
logger.info("my first time");
}
}
运行可得结果
证明日志已经成功运行。
日志相关属性
文件输出
默认情况下,Spring Boot 将日志输出到控制台,不会写到日志文件。如果要编写除控制台输出之外的日志文件,则需在 application.properties 中设置 logging.file 或 logging.path 属性。
logging.file 属性用于设置文件,可以是绝对路径或者相对路径。例如:
# 日志配置
logging.file = log/test.log
可以发现当前目录下确实生成了日志文件。
logging.path 属性用于设置目录,会在该目录下创建 spring.log 文件,并写入日志内容,例如:
# 日志配置
logging.path = log/test-01
易发现在 /log/test-01 文件夹中生成一个日志文件为 spring.log。
注意,二者不能同时使用,如若同时使用,则只有 logging.file 生效。
级别控制
我们知道日志级别为 TARCE < DEBUG < INFO < WARN < ERROR < FATAL,举个例子,如果我们的日志级别设置为 INFO ,那么 TARCE 和 DEBUG 的日志我们都是看不到的。
Spring Boot 的默认级别是 INFO,如果我们想改为 WARN ,添加下面一行代码即可:
logging.level.root = warn
我这里用的是 root 级别,表示项目下的所有日志,当然我们也可以使用 package 级别,即在指定包下使用相应的日志级别。
运行一看,怎么空空如也?
实际上,这是由于打印的日志级别设置为 WARN,所以 INFO 级别的日志都不显示了。
那好,我现在有一个需求,需要 edu.szu.test.MyTest 下的日志级别设置为 INFO,应该如何实现?其实,在 application.properties 中加入一行代码即可。
logging.level.root = warn
logging.level.edu.szu.test.MyTest = info
现在我们运行一下,发现内容如下
表明 edu.szu.test.MyTest 下的日志级别成功改为 INFO。
日志格式
定制日志在控制台的输出格式
logging.pattern.console = %d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %logger- %msg%n
定制日志在文件的输出格式
logging.pattern.file = %d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n