这篇开始学注解,我们只是挑选常见和常用的注解来学习。本篇来掌握Before和After两个注解的基本使用方法。Before可以理解为事先,After理解为事后,而@Test标注的测试方法就是这件事情。
1. Before 和After和Test方法关系
当前@Befre 和@After注解都是测试方法层的,作用的范围是@Test标注的方法。
2.再添加一个用例
添加一个用例,初始化上来就做removeProein()方法,这个事后total=-5, 执行后面if判断,total又被设置等于0.
package test;
import static org.junit.Assert.*;
import org.junit.Test;
import com.anthony.protein.TrackingService;
public class TrackingServiceTests {
@Test
public void newTrackingServiceTotalIsZero() {
TrackingService ts = new TrackingService();
assertEquals("Tracking service total was not zero", 1, ts.getTotal());
}
@Test
public void whenAddingProteinTotalIsIncreaseByAmount() {
TrackingService ts = new TrackingService();
ts.addProtein(10);
assertEquals(10, ts.getTotal());
}
@Test
public void whenRemovingProteinTotalRemainsZero() {
TrackingService ts = new TrackingService();
ts.removeProtein(5);
assertEquals(0, ts.getTotal());
}
}
上面单个用例都测试通过。
3. 代码优化
上面每个用例下我们一上来都要进行new TrackingService对象,所以,我们先来优化,重构下代码,把重复代码提取出来。
package test;
import static org.junit.Assert.*;
import org.junit.Test;
import com.anthony.protein.TrackingService;
public class TrackingServiceTests {
private TrackingService ts = new TrackingService();
@Test
public void newTrackingServiceTotalIsZero() {
assertEquals("Tracking service total was not zero", 0, ts.getTotal());
}
@Test
public void whenAddingProteinTotalIsIncreaseByAmount() {
ts.addProtein(10);
assertEquals(10, ts.getTotal());
}
@Test
public void whenRemovingProteinTotalRemainsZero() {
ts.removeProtein(5);
assertEquals(0, ts.getTotal());
}
}
重复代码是提取出来了,但是执行上面第一个用例,有可能会报错,因为TrackingService不是一个新的new出来对象,他的total是有值,但是我们暂时没有办法取控制让这个第一个执行顺序。这个时候,我们需要借助@Before注解,把new对象这个代码放在一个方法中,一般这个和@Before匹配的方法是setup(), 我们可以这样去组织代码。
package test;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import com.anthony.protein.TrackingService;
public class TrackingServiceTests {
private TrackingService ts;
@Before
public void setup() {
System.out.println("Before Method");
ts = new TrackingService();
}
@Test
public void newTrackingServiceTotalIsZero() {
assertEquals("Tracking service total was not zero", 0, ts.getTotal());
}
@Test
public void whenAddingProteinTotalIsIncreaseByAmount() {
ts.addProtein(10);
assertEquals(10, ts.getTotal());
}
@Test
public void whenRemovingProteinTotalRemainsZero() {
ts.removeProtein(5);
assertEquals(0, ts.getTotal());
}
}
再次强调下,@Before标注过的方法是针对这个类文件中所有的@Test标注过的测试方法,每一个@Test方法执行前都需要去执行一遍@Before标注的setup()方法。
5.使用@After
有了@Before的理解,@After就简单了,一般用于释放资源操作,例如回滚数据库等。
package test;
import static org.junit.Assert.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.anthony.protein.TrackingService;
public class TrackingServiceTests {
private TrackingService ts;
@Before
public void setup() {
System.out.println("Before Method");
ts = new TrackingService();
}
@After
public void tearDown() {
System.out.println("After Method");
}
@Test
public void newTrackingServiceTotalIsZero() {
assertEquals("Tracking service total was not zero", 0, ts.getTotal());
}
@Test
public void whenAddingProteinTotalIsIncreaseByAmount() {
ts.addProtein(10);
assertEquals(10, ts.getTotal());
}
@Test
public void whenRemovingProteinTotalRemainsZero() {
ts.removeProtein(5);
assertEquals(0, ts.getTotal());
}
}
运行输出
Before Method
After Method
Before Method
After Method
Before Method
After Method
三个用例方法,都执行过一遍Before和After方法。