闲聊:最近线上的项目其中某个逻辑中途改了个sql,没有测试就急急忙忙提交了,结果上线后就悲剧了,参数没传进去,无奈,版本回退(就规范性来说,自测时一定要写测试用例单独测试持久层方法和业务逻辑流转)
准备工作,pom中引入依赖,我的sprig version是4.0.0.RELEASE
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<!--<scope>test</scope>-->
</dependency>
首先,在正规的项目目录中,我们建立项目目录一般会建立一个和java平级的test的目录,test目录里面也是和普通的包级分类一样,分包写测试用例,并把test目录作为Test Sources Root使用
一般来说,平时开发或项目中间临时改动了持久层都是要经过测试的,所以单元测试也极其重要(规范做法)
Junit常用注解:
@BeforeClass 全局初始化加载一次(仅一次);
@Berore 在标注有@Test的测试方法之前运行;
@Test 需要测试的方法;
@After 在测试方法之后执行;
@AfterClass 全局最后一个执行的方法;
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;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
@TransactionConfiguration(transactionManager = "transactionManager",defaultRollback = true)
public class CartServiceTest {
@Autowired
private CartMapper cartMapper;
@Autowired
private CartService cartService;
@Test
public void testCartService(){
Cart cart = cartMapper.selectByPrimaryKey(126);
assert cart != null;
}
}
1、@Runnwith后面跟的是单元测试运行器指定的执行类,例如JUnit.class、Suite.class,我们一般是spring环境,所以使用SpringJUnit4ClassRunner.class 让测试运行于spring环境,方便测试持久层;
2、@ContextConfiguration指定spring配置文件路径,支持多个,@ContextConfiguration(locations={"classpath:spring1.xml","classpath:spring2.xml"})
3、@TransactionConfiguraton(transactionManager="transactionManager",defaultRollback=true)表示关联配置文件中事务控制器,同时defaultRollback=true回滚为true
4、@Transactional开启事务注解,我试了同时使用@Transactional和@TransactionConfiguraton时,defaultRollback必须=true才会使操作回滚、事务生效,但是如果我仅使用@Transactional而不使用@TransactionConfiguraton注解,事务也会生效
5、如果待测试的service层中自己就已经包含了@Transactional那会是什么情况呢?测试后发现这种情况和测试类中使用@Transactional效果是一致的,都能回滚
注:
1、@Test标注的测试方法无返回值、无入参,
2、@Test测试方法不能为static修饰、只能为public void ××().