单元测试
保证独立性。
Assert:断言,一般用来比较是否相等,比如
Assert.assertEquals
在JUnit测试框架中,@BeforeClass,@Before,@After和@AfterClass是四个常用的注解,它们的作用如下:
@BeforeClass:这个注解应用于静态方法,表示这个方法会在所有测试方法之前执行一次。通常用于进行一些耗时的初始化操作,例如连接数据库。
@Before:这个注解应用于方法,表示这个方法会在每个测试方法执行之前执行。通常用于进行一些初始化操作,例如重置某些变量。
@After:这个注解应用于方法,表示这个方法会在每个测试方法执行之后执行。通常用于进行一些清理操作,例如关闭数据库连接。
@AfterClass:这个注解应用于静态方法,表示这个方法会在所有测试方法之后执行一次。通常用于进行一些清理操作,例如释放资源。
这四个注解的执行顺序是:@BeforeClass -> @Before -> 测试方法 -> @After -> @AfterClass。
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class SpringBootTests {@Autowiredprivate DiscussPostService discussPostService;private DiscussPost data;@BeforeClasspublic static void beforeClass() {System.out.println("beforeClass");}@Beforepublic void before() {// 初始化测试数据System.out.println("before");this.data = new DiscussPost();data.setUserId(111);data.setTitle("test title");data.setContent("Test");data.setCreateTime(new Date());data.setScore(Math.random() * 2000);discussPostService.addDiscussPost(data);}@Afterpublic void after() {// 删除测试数据System.out.println("after");discussPostService.updateStatus(data.getId(), 2);}@AfterClasspublic static void afterClass() {System.out.println("afterClass");}@Testpublic void testFindById() {DiscussPost post = discussPostService.findDiscussPostById(data.getId());//判断data和post是否一致Assert.assertNotNull(post);Assert.assertEquals(data.getTitle(), post.getTitle());Assert.assertEquals(data.getContent(), post.getContent());}@Testpublic void testUpdateScore() {int rows = discussPostService.updateScore(data.getId(), 2000.00);Assert.assertEquals(1, rows);DiscussPost post = discussPostService.findDiscussPostById(data.getId());Assert.assertEquals(2000.00, post.getScore(), 2);}}
执行整个类:
项目监控
下面演示的使用HTTP进行监控。
导入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
导入后就默认启用,二十多个端点大多数都启用,只有一个关闭服务器的端点未启用)最好不要启用),但只暴露了两个端点(health和info)
配置暴露
除了info和caches端点其余全暴露:
# 暴露所有端点
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=info,caches
management.endpoint.health.show-details=always
beans:
loggers:
…
自定义端点
创建actuator/DatabaseEndPoint类:
@Component
//访问路径:/actuator/database
@Endpoint(id = "database")
public class DatabaseEndpoint {private static final Logger logger = LoggerFactory.getLogger(DatabaseEndpoint.class);//通过连接池获取连接,查询数据库@Autowiredprivate DataSource dataSource;//ReadOperation表示只能通过GET请求访问@ReadOperationpublic String checkConnection() {try (Connection conn = dataSource.getConnection();) {return CommunityUtil.getJsonString(0, "获取连接成功!");} catch (Exception e) {logger.error("获取连接失败!" + e.getMessage());return CommunityUtil.getJsonString(1, "获取连接失败!");}}}
访问database:
添加权限管理
.requestMatchers("/discuss/delete","/data/**","/actuator/**").hasAnyAuthority(AUTHORITY_ADMIN)
项目部署(Deprecated)
本地代码传到云服务器→ 云服务器打包→ 云服务器部署
云服务器内存暂时不够,先跳过。
项目总结
常见面试题(Deprecated)
等到面试在看。