六、MVC架構測試
1、部署到 tomcat 伺服器中進行測試
在建立Servers服務清單中找到 tomcat 9,點右鍵,選 Add and Remove...,将目前項目部署到 tomcat 服務容器中,然後選擇start啟動tomcat服務。

控制台視窗中可以看到 tomcat的啟動日志,啟動完成且沒有報錯,說明部署成功。
打開浏覽器,輸入 http://localhost:8080/springDemo/userList,其中springDemo為項目名稱,将會調用控制層 HelloWorldController 類的 listAllUserTest 方法,listAllUserTest方法中會調用服務層 UserService 類的 getUserList方法,getUserList方法又調用 DAO 層的UserDao的getUserList方法,通過 mybatis,從資料庫中取出使用者表中的資料,轉換成json,顯示在浏覽器前端。
浏覽器中能顯示如圖json字串,則測試成功。
2、Junit單元測試、mockMvc測試。
建立測試類 WebTest.java,代碼如下:
/**
* 為友善測試,可靜态導入以下包
* MockMvcBuilders.*;
* MockMvcRequestBuilders.*;
* MockMvcResultMatchers.*;
* MockMvcResultHandlers.*;
* @author iceher0
*
*/
@SpringJUnitWebConfig(WebMvcConfig.class)
public class WebTest {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@BeforeEach
void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void helloTest() {
try {
ResultActions resultActions = this.mockMvc.perform(get("/jsontest"));
resultActions.andExpect(MockMvcResultMatchers.status().isOk());
MvcResult mvcResult = resultActions.andReturn();
String result = mvcResult.getResponse().getContentAsString();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void userListTest() {
try {
ResultActions resultActions = this.mockMvc.perform(get("/userList"));
resultActions.andExpect(MockMvcResultMatchers.status().isOk());
MvcResult mvcResult = resultActions.andReturn();
String result = mvcResult.getResponse().getContentAsString();
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在方法 userListTest 上點右鍵,選 Run As--> Junit Test,進行單元測試,該測試将模拟浏覽器 http 請求,同樣會調用 HelloWorldController 層對應的方法
控制台最後調試資訊列印出了使用者表中的資訊。
七、事務控制測試
springmvc架構的一個重要特性就是可以進行事務控制,下面對事務控制進行測試
在我們的使用者表基本上, 我們設計一張關聯的資料庫表,UserInfo,儲存使用者詳細資訊。我們設計時規定使用者的手機号碼在表中是唯一的,以手機号碼字段建立一個唯一索引,并預埋一條測試資料,代碼如下:
CREATE TABLE TEST_USERINFO(
NAME VARCHAR2(100),
PHONENUMBER VARCHAR2(32),
ADDRESS VARCHAR2(255)
);
ALTER TABLE TEST_USERINFO ADD CONSTRAINT un_userinfo_1 unique("PHONENUMBER");
INSERT into TEST_USERINFO(name, Phonenumber, address)
values('iceher0', '123456789', '地球村');
編寫對應的UserInfo實體類 UserInfo.java
public class UserInfo {
private String name;
private String phoneNumber;
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
在 Dao 層中的 UserDao.java 中增加添加使用者和使用者資訊的方法
public void addUser(User user);
public void addUserInfo(UserInfo userInfo);
在UserMapper.xml檔案中添加對應的sql映射
<insert id="addUser" parameterType="com.gznxbank.app.demo.model.User">
insert into test_user(name, age)
values(#{name},#{age})
</insert>
<insert id="addUserInfo" parameterType="com.gznxbank.app.demo.model.UserInfo">
insert into test_userinfo(name, phoneNumber, address)
values(#{name},#{phoneNumber},#{address})
</insert>
Service層 UserService 接口中添加方法:
public void addUserAndInfo(User user, UserInfo userInfo);
UserSerivceImpl 實作類中編寫方法邏輯,首先執行添加使用者,然後添加使用者資訊,在方法名稱上一行添加了 @Transactional 注解,表示該方法為一個事務
@Override
@Transactional
public void addUserAndInfo(User user, UserInfo userInfo) {
userDao.addUser(user);
userDao.addUserInfo(userInfo);
}
編寫一個測試類,ServiceTest.java,正案例代碼如下:
@SpringJUnitWebConfig(WebMvcConfig.class)
public class ServcieTest {
@Autowired
UserService userService;
@Test
/**
* 事務測試
*/
public void addUserAndInfoTest() {
User user = new User();
user.setName("Mr.spring");
user.setAge(18);
UserInfo userInfo = new UserInfo();
userInfo.setName("Mr.spring");
userInfo.setPhoneNumber("100123456");
userInfo.setAddress("地球村");
userService.addUserAndInfo(user, userInfo);
}
}
從控制台中看調試資訊,顯示Mr.spring的使用者和使用者資訊都更新到資料庫了
我們修改一下測試代碼,設定phoneNumber為已存在資料庫表的值,反案例代碼如下:
@Test
public void addUserAndInfoTest() {
User user = new User();
user.setName("Mr.mybatis");
user.setAge(19);
UserInfo userInfo = new UserInfo();
userInfo.setName("Mr.mybaits");
userInfo.setPhoneNumber("123456789");
userInfo.setAddress("地球村");
userService.addUserAndInfo(user, userInfo);
}
控制台調試資訊中,更新了使用者,但未更新使用者資訊,左側的單元測試也報錯,有提示 違反唯一限制條件
查詢資料庫驗證一下,Mr.mybatis的使用者和使用者資訊是否插入,查詢可以看到,Mr.spring 的使用者和使用者資訊資料已經正常插入,Mr.mybatis由于手機号碼已存在,使用者和使用者資訊資料都未插入
八、切面程式設計測試
編寫HelloAspect切面類,切入點為HelloWorldController類中的listAllUserTest方法。在切入點前和切入點後分别輸出日志資訊
@Aspect
@Component
public class HelloAspect {
Logger logger = LogManager.getLogger(HelloAspect.class);
@Pointcut("execution(public * com.gznxbank.app.demo.controller.HelloWorldController.listAllUserTest())")
public void getUserList() { }
@Before("getUserList()")
public void beforelistUser() {
logger.info("切面測試---------->Before listUer.");
}
@After("getUserList()")
public void afterlistUser() {
logger.info("切面測試---------->After listUer.");
}
}
在WebTest.java中的uesrListTest方法中重新執行單元測試,控制台輸出結果如下,可以看到切面測試結果正确
九、結語
SpringMVC架構主要的幾種特性測試完畢,測試案例很簡單,springframework讓我們可以快速部署web應用程式,但要想玩轉springframework,熟練運用spring架構的功能,得深入研讀springframework源代碼。
測試項目檔案結構如下: