網頁

2014年1月5日 星期日

Effective Java單元測試JUnit

實作了RoleImpl class,現在要開始單元測試了,或許你會覺得奇怪,才剛做好一個class而已,它並沒有商務邏輯,只有getter/setter與clone(),那是要測試什麼呢?沒錯,傳統上而言,是會等到有功能後才進行測試,甚至沒有單元測試,而是直接交付給測試人員或使用者,進行整合測試。



這次Mix將導入Test-driven development(TDD),測試驅動開發的觀念,使用JUnit來作為單元測試,先寫測試程式,然後再寫程式實現其功能,雖然實務上不太容易來落實,所以並不一定是要遵循這種方式開發,只是希望藉由此過程,能夠培養開發人員撰寫測試程式的習慣。



關於如何撰寫測試程式碼,Mix是使用JUnit來進行這一部分的工作,或是你也可以使用其他工具來撰寫,這次分別寫了3個測試method:

  1. setter(),主要測試getter/setter。
  2. clonez() ,主要測試clone()。
  3. equals(),主要測試equals()。

package org.openyu.java.role.vo.impl;

import static org.junit.Assert.*;

import org.junit.Test;
import org.openyu.java.role.vo.Role;

/**
 * The Class RoleImplTest.
 */
public class RoleImplTest {

 /**
  * Instantiates a new role impl test.
  */
 public RoleImplTest() {
 }

 /**
  * Setter.
  */
 @Test
 public void setter() {
  Role result = new RoleImpl();
  result.setId(1);
  System.out.println(result.getId());
  assertEquals(1, result.getId());
  //
  result.setName("OpenYu");
  System.out.println(result.getName());
  assertEquals("OpenYu", result.getName());
  //
  result.setStrength(100);
  System.out.println(result.getStrength());
  assertEquals(100, result.getStrength());
 }

 /**
  * Clonez.
  */
 @Test
 public void clonez() {
  Role role = new RoleImpl();
  role.setId(1);
  role.setName("OpenYu");
  role.setStrength(100);

  // clone
  Role result = (Role) role.clone();
  assertNotNull(result);

  // 複製出來的role2與role1, 所有field值相等
  System.out.println(result.getId());
  assertEquals(role.getId(), result.getId());
  //
  System.out.println(result.getName());
  assertEquals(role.getName(), result.getName());
  //
  System.out.println(result.getStrength());
  assertEquals(role.getStrength(), result.getStrength());
  //
  result.setId(2);// role2改變id,不會改到role1.id
  System.out.println(result.getId());
  assertTrue(role.getId() != result.getId());
 }

 /**
  * Equals.
  */
 @Test
 public void equals() {
  Role role = new RoleImpl();
  role.setId(1);
  //
  Role role2 = new RoleImpl();
  role2.setId(1);
  //
  System.out.println(role.getId() + ", " + role2.getId());
  
  boolean result = role.equals(role2);
  System.out.println(result);
  // 尚未覆寫equals時,會測試失敗
  assertTrue(result);
 }
}






Mix發現在JUinit中,equals()的method測試失敗了,這是因為尚未覆寫equals(),預期與實際不相等,這就是TDD所提倡的,先寫測試程式,再實作其功能,Mix之後將會再覆寫equals(),以期符合測試成功。




console查看其結果。

1
OpenYu
100
2
1, 1
false
1
OpenYu
100












  1. 撰寫JUnit Test Case。
  2. 撰寫setter()測試方法
  3. 撰寫clonez()測試方法
  4. 撰寫setter()測試方法



沒有留言:

張貼留言

Related Posts Plugin for WordPress, Blogger...