1、@RunWith: 测试运行器,JUnit所有的测试方法都是由测试运行器负责执行。
其作用是使用JUnit执行一个测试套件。Suite类是JUnit自带的,意为套件,顾名思义,就是一套东西。通过它,可以把多个相关的测试类看做一个测试套件一起测试。
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({ TestA.class, TestB.class, /*Any test class you want to run*/})
public class TestSuite {
// Please note this case won't run. It will only run cases which
// are configured in @Suite.SuiteClasses
@Test
public void testPrint() {
System.out.println("Hello");
}
}
@RunWith指定了Suite类,说明这个TestSuite类是一个套件。通过@Suite.SuiteClas0
ses指定了要执行的测试类(这些类中的所有用例都会执行)。
需要注意的是,这个TestSuite类本身用例则不会执行了(如上面的testPrint()方法)。
(2)@RunWith(SpringJUnit4ClassRunner.class)
关于Spring项目的单元测试的同学可能见过这样的写法,就是用JUnit加载Spring的配置文件以完成Context的初始化,然后从Context中取出Bean并完成测试:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
public class UserManagerTest {
@Autowired
ApplicationContext ctx;
@Test
public void testAddUser() {
try {
UserManager userManager = ctx.getBean(UserManager.class);
userManager.addUser();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//涉及mock测试
package test.controller.LogsController;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.naton.controller.LogsController;
import com.naton.pojo.example.ParamExample;
@RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试
@ContextConfiguration({"classpath:applicationContext.xml"})
public class SearchTest {
@Autowired
LogsController longogsController;
@Test
public void testGetList() {
ParamExample param = new ParamExample();
longogsController.search(param);
}
}
参考:http://sparkgis.com/java/2017/10/junit高级用法之runwith-原-junit高级用法之runwith-摆渡者/
2、@ContextConfiguration: 引入配置文件,Spring-Test的这个配置只认classpath,很无奈,我必须拷贝这些文件到根目录!
单个文件:
@ContextConfiguration(locations = { "classpath:applicationContext.xml" })
@ContextConfiguration(classes = SimpleConfiguration.class)
多个文件时,可用{}:
@ContextConfiguration(locations = { "classpath*:/spring1.xml", "classpath*:/spring2.xml" })
@ContextConfiguration(classes = {AppConfig.class, TestAppConfig.class})
3、@Autowired:是一种函数,可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作
例:
@Autowired AnnController annController;//类对象 @Autowired private AnnService annService; //AnnService是接口
@Autowired @Qualifier("BMW") //括号里这个是实现的子类的类名
private Car car; //car接口有多个实现类,要表明是个子类
4、@Transactional
@TransactionConfiguration:事物配置
(transactionManager = "transactionManager", defaultRollback = true)
这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!
@BeforeTransaction
表明被注解的public void
方法应该在测试方法的事务开始之前执行, 该事务是通过@Transactional
注解来配置的。
@AfterTransaction
表明被注解的public void
方法应该在测试方法的事务结束之后执行, 该事务是通过@Transactional
注解来配置的。
5、@NotTransactional:表明测试方法必须不在事务中执行。
6、@Repeat
表明被注解的测试方法必须重复执行。执行的次数在注解中声明。
注意重复执行范围包括包括测试方法本身的执行,以及任何测试fixture的set up或tear down。
@Repeat(10)
public void testProcessRepeatedly() {
// …
}
参考:https://www.cnblogs.com/minideas/archive/2011/07/21/2112964.html
http://snowolf.iteye.com/blog/588351#comments