目录
常见的系统注解:
JavaSE中内置三个标准注解,定义在java.lang中:
@Override
限定重写父类方法,若想要重写父类的一个方法时,需要使用该注解告知编译器我们正在重写一个方法。如此一 来,当父类的方法被删除或修改了,编译器会提示错误信息;或者该方法不是重写也会提示错误。
public interface Car {
void run();
}
class QQ implements Car{
@Override
public void run() {}
}
class Bmw implements Car{
@Override
void run() {}
}
@Deprecated
标记已过时,当我们想要让编译器知道一个方法已经被弃用(deprecate)时,应该使用这个注解。Java推荐在 javadoc中提供信息,告知用户为什么这个方法被弃用了,以及替代方法是什么
/**
\* Deprecated -->该方法过时(有更好的解决方案)
\* @author Administrator
*/
public class TestDeprecated {
@Deprecated
public int test(){
System.out.println("TestDeprecated.test()");
return 0;
}
public void test(int a){
System.out.println("TestDeprecated.test(int)");
}
}
@SuppressWarnings
抑制编译器警告,该注解仅仅告知编译器,忽略它们产生了特殊警告。如:在java泛型中使用原始类型。其保持性 策略(retention policy)是SOURCE,在编译器中将被丢弃。
/**
\* SuppressWarnings 压制警告
\* @author Administrator
*/
public class TestSuppressWarnings {
public static void main(String[] args) {
@SuppressWarnings("unused")
List<String> list =new ArrayList<String>();
}
@SuppressWarnings("rawtypes") //没有定义范型
public static List test(){
return new ArrayList();
}
}
JUnit4注解
@Test
@Test注解的public void方法将会被当做测试用例
JUnit每次都会创建一个新的测试实例,然后调用@Test注解方法
任何异常的抛出都会认为测试失败
@Test注解提供2个参数:
1,“expected”,定义测试方法应该抛出的异常,如果测试方法没有抛出异常或者抛出了一个不同的异常,测试失败
2,“timeout”,如果测试运行时间长于该定义时间,测试失败(单位为毫秒)
public class MathTest {
@Test(expected=Exception.class)
public void testAdd() throws Exception{
throw new Exception();
}
}
public class MathTest {
@Test(timeout=5000)
public void testAdd() {
for(;;){
}
}
}
@After
如果在@Before注解方法中分配了额外的资源,那么在测试执行完后,需要释放分配的资源。
使用@After注解一个public void方法会使该方法在@Test注解方法执行后被执行
即使在@Before注解方法、@Test注解方法中抛出了异常,所有的@After注解方法依然会被执行,见示例
父类中的@After注解方法会在子类@After注解方法执行后被执行
public class MathTest {
@Before
public void setUp() throws Exception {
throw new Exception();
}
@Test
public void testAdd() {
Math m = new Math();
assertTrue(m.add(1, 1) == 2);
}
@After
public void tearDown() throws Exception {
System.out.println("after");
}
}
after
@AfterClass
如果在@BeforeClass注解方法中分配了代价高昂的额外的资源,那么在测试类中的所有测试方法执行完后,需要释放分配的资源。
使用@AfterClass注解一个public static void方法会使该方法在测试类中的所有测试方法执行完后被执行
即使在@BeforeClass注解方法中抛出了异常,所有的@AfterClass注解方法依然会被执行
父类中的@AfterClass注解方法会在子类@AfterClass注解方法执行后被执行
@Before
当编写测试方法时,经常会发现一些方法在执行前需要创建相同的对象
使用@Before注解一个public void 方法会使该方法在@Test注解方法被执行前执行(那么就可以在该方法中创建相同的对象)
父类的@Before注解方法会在子类的@Before注解方法执行前执行
@BeforeClass
有些时候,一些测试需要共享代价高昂的步骤(如数据库登录),这会破坏测试独立性,通常是需要优化的
使用@BeforeClass注解一个public static void 方法,并且该方法不带任何参数,会使该方法在所有测试方法被执行前执行一次,并且只执行一次
父类的@BeforeClass注解方法会在子类的@BeforeClass注解方法执行前执行
@Ignore
对包含测试类的类或@Test注解方法使用@Ignore注解将使被注解的类或方法不会被当做测试执行
JUnit执行结果中会报告被忽略的测试数
public class MathTest {
@Ignore("do not test")
@Test
public void testAdd() {
Math m = new Math();
assertTrue(m.add(1, 1) == 2);
}
}
@Ignore
public class MathTest {
@Test
public void testAdd() {
Math m = new Math();
assertTrue(m.add(1, 1) == 2);
}
}
执行结果相同: