首先声明一下。这个基础版本代码框架并没有进行连接数据库的操作,未来会发布其他版本连接数据库操作的基础框架
一个好的基础框架会让你写代码速度更快,规范性更好,让你的代码更稳定。
很多程序员在写代码的时候容易忽略一些基础功能的搭建,小弟不才分享一下自己搭建的一个spring boot3的基础框架
希望与大家一起互相学习,共同进步。
搭建一个基础框架首先加入的是日志打印系统。可以把日志分不同等级进行打印,还可以按天进行日志汇总
其次需要加入的是单元测试,单元测试分包括spring 组件扫描的单元测试,不包括spring 组件扫描的单元测试。
在需要spring组件扫描的单元测试时,又分为带事务控制的单元测试,与不带事务的单元测试。
日志打印这里我们选择的是log4j2
单元测试选择的是TestNG
服务层单元测试代码示例如下
package com.vsked.auth.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.testng.annotations.Test;
import com.vsked.test.BaseTestWithoutTransactional;
public class AccountServiceTest extends BaseTestWithoutTransactional {
private static final Logger log = LoggerFactory.getLogger(AccountServiceTest.class);
@Autowired
AccountService accountService;
@Test
public void test1() throws Exception {
if(log.isTraceEnabled()){
log.trace("start");
}
String accountId=accountService.getAccountId();
log.info("accountId is :{}" ,accountId );
if(log.isTraceEnabled()){
log.trace("end");
}
}
}
控制层单元测试如下
package com.vsked.auth.web;
import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import java.io.File;
import java.io.FileInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultHandlers;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.vsked.test.BaseTestWithoutTransactional;
@AutoConfigureMockMvc //自动配置mvc注解
public class TestControllerTest extends BaseTestWithoutTransactional {
private static final Logger log = LoggerFactory.getLogger(TestControllerTest.class);
@Autowired
MockMvc mvc;
@Test
public void test1() throws Exception {
log.info("TestControllerTest test1 start ");
// 用来测试post,前端传值时直接传参数,后端封装成对象用@ModelAttribute
RequestBuilder reqBuilder = post("/test")
.param("username", "vskeda1username")
.param("password", "mypassword is unknown");
String respStr=mvc.perform(reqBuilder)
.andExpect(status().isOk())
.andDo(print())
.andReturn()
.getResponse()
.getContentAsString();
log.info("{}",respStr);
Assert.assertEquals(respStr,"jinan37001");
log.info("TestControllerTest test1 end ");
}
@Test
public void test3() throws Exception {
log.info("TestControllerTest test2 start ");
// 用来测试get,前端在请求路径或问号后面传参数时,
// 后端封装用@PathVariable("ida") String id 或 @RequestParam("username") String username
RequestBuilder request = get("/test/9631").param("username", "vskeda1username").param("password",
"mypassword is unknown");
mvc.perform(request).andExpect(status().isOk())
.andExpect(content().string(equalTo("9631testokvskeda1usernamemypassword is unknown")));
log.info("TestControllerTest test2 end ");
}
@Test
public void fileTest() throws Exception {
log.info("TestControllerTest fileTest start ");
ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.multipart("/test/input")
.file(new MockMultipartFile("inputFile", "newtest1.gif", "application/ms-excel",
new FileInputStream(new File("C:/Users/testdeveloper3/Desktop/测试图片/Stamp/aaa.gif"))))
.file(new MockMultipartFile("inputFile", "newtest2.gif", "application/ms-excel",
new FileInputStream(new File("C:/Users/testdeveloper3/Desktop/测试图片/Stamp/bbb.gif"))))
.param("inputText", "11111111").param("inputTextarea", "22222")
);
MvcResult mvcResult = resultActions.andDo(MockMvcResultHandlers.print()).andExpect(MockMvcResultMatchers.status().isOk()).andReturn();
String result = mvcResult.getResponse().getContentAsString();
log.info("==========结果为:==========\\n " + result + "\n" );
log.info("TestControllerTest fileTest end ");
}
}
当然控制层如果不想使用代码来进行单元测试,可以用Apifox,postman,postwoman等API测试工具来进行测试
以下是基础框架详细代码

