单元测试
保证独立性。

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 {
    @Autowired
    private DiscussPostService discussPostService;
    private DiscussPost data;
    @BeforeClass
    public static void beforeClass() {
        System.out.println("beforeClass");
    }
    @Before
    public 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);
    }
    @After
    public void after() {
        // 删除测试数据
        System.out.println("after");
        discussPostService.updateStatus(data.getId(), 2);
    }
    @AfterClass
    public static void afterClass() {
        System.out.println("afterClass");
    }
    @Test
    public 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());
    }
    @Test
    public 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);
    //通过连接池获取连接,查询数据库
    @Autowired
    private DataSource dataSource;
    //ReadOperation表示只能通过GET请求访问
    @ReadOperation
    public 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)
 
等到面试在看。



















