天天看點

springmvc項目,注解方式配置(五)JUnit、事務、切面測試

六、MVC架構測試

1、部署到 tomcat 伺服器中進行測試

在建立Servers服務清單中找到 tomcat 9,點右鍵,選 Add and Remove...,将目前項目部署到 tomcat 服務容器中,然後選擇start啟動tomcat服務。

springmvc項目,注解方式配置(五)JUnit、事務、切面測試

控制台視窗中可以看到 tomcat的啟動日志,啟動完成且沒有報錯,說明部署成功。

springmvc項目,注解方式配置(五)JUnit、事務、切面測試

打開浏覽器,輸入 http://localhost:8080/springDemo/userList,其中springDemo為項目名稱,将會調用控制層 HelloWorldController 類的 listAllUserTest 方法,listAllUserTest方法中會調用服務層 UserService 類的 getUserList方法,getUserList方法又調用 DAO 層的UserDao的getUserList方法,通過 mybatis,從資料庫中取出使用者表中的資料,轉換成json,顯示在浏覽器前端。

浏覽器中能顯示如圖json字串,則測試成功。

springmvc項目,注解方式配置(五)JUnit、事務、切面測試

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項目,注解方式配置(五)JUnit、事務、切面測試

七、事務控制測試

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的使用者和使用者資訊都更新到資料庫了

springmvc項目,注解方式配置(五)JUnit、事務、切面測試

我們修改一下測試代碼,設定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);
	}
           

控制台調試資訊中,更新了使用者,但未更新使用者資訊,左側的單元測試也報錯,有提示 違反唯一限制條件

springmvc項目,注解方式配置(五)JUnit、事務、切面測試

查詢資料庫驗證一下,Mr.mybatis的使用者和使用者資訊是否插入,查詢可以看到,Mr.spring 的使用者和使用者資訊資料已經正常插入,Mr.mybatis由于手機号碼已存在,使用者和使用者資訊資料都未插入

springmvc項目,注解方式配置(五)JUnit、事務、切面測試
springmvc項目,注解方式配置(五)JUnit、事務、切面測試

八、切面程式設計測試

編寫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項目,注解方式配置(五)JUnit、事務、切面測試

九、結語

SpringMVC架構主要的幾種特性測試完畢,測試案例很簡單,springframework讓我們可以快速部署web應用程式,但要想玩轉springframework,熟練運用spring架構的功能,得深入研讀springframework源代碼。

測試項目檔案結構如下:

springmvc項目,注解方式配置(五)JUnit、事務、切面測試