@Test
执行顺序JUnit4.11之后提供了MethodSorters,在测试类上加注解@FixMethodOrder(value)
可以有三种方式对test执行顺序进行指定,如下:
默认(MethodSorters.DEFAULT),按方法名(MethodSorters.NAME_ASCENDING)和JVM(MethodSorters.JVM)
blog表
的测试中使用了这种排序规则实际上 Junit里是通过反射机制得到某个Junit里的所有测试方法,并生成一个方法的数组,然后依次执行数组里的这些测试方法; 而当用annotation指定了执行顺序,Junit在得到测试方法的数组后,会根据指定的顺序对数组里的方法进行排序;
由于Junit4
不同测试(即每一个@Test
都是一个单独的单元测试,每个测试方法执行前都会重新实例化测试类)的默认执行顺序是按照方法名的hash值
排序,没有并行测试。
所以可以用@Transactional
注解每个测试类,测试类内部如果没有设置事务,则默认和类相同。那么在测试中,只要我们不提交事务,Spring默认会测试完毕回滚,因此不同的测试单元之前数据互不影响。
特别注意:在test
中,Spring默认测试结束就会回滚,如果不想回滚,可以用@Rollback(false)
注解;
而在一般的Java类中,Spring默认只有在抛出的异常为运行时unchecked异常时才回滚该事务,也就是抛出的异常为RuntimeException的子类(Errors也会导致事务回滚),而抛出checked异常则不会导致事务回滚,我们可以用@Transactional
注解的rollbackFor
属性设置其他的
解决1(不推荐):利用@FixMethodOrder(MethodSorters.NAME_ASCENDING)
注解设定按照方法名字典顺序执行测试,可以按照下面的命名方式:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MyBlogApplication.class)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class BlogMapperTest1 {
@Autowired
private BlogMapper blogMapper;
@Autowired
private UserMapper userMapper;
@Test
public void test1InsertBlog() throws Exception {
}
@Test
public void test2SelectBlogByUserUuid() throws Exception {
}
@Test
public void test3DeleteBlogByBlogUuid() throws Exception {
}
}
解决2: 每个单元测试都重新构造数据。。。当增删改查很多时,为了保证测试类的清晰,推荐这种方法。
解决3: 把你需要共享数据所有操作放到一个@Test
注解的方法中,比较适合操作比较少的测试。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。