一。使用Mockito
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>3.8.0</version>
<scope>test</scope>
</dependency>
@RunWith(MockitoJUnitRunner.class)
public class HelloTest {
@Mock
private StuDao stuDao;
//InjectMocks 注解会把上面的mock的stuDao对象注入到stuService中,这样我们就能测试insertStu方法了
@InjectMocks
private StuService stuService;
@Test
public void testInsertStu(){
String name = "jack";
Stu stu = new Stu();
stu.setName(name);
//mock 调stuDao.insertUser(stu)的返回
when(stuDao.insertUser(stu)).thenReturn(1);
stuService.insertStu(name);
}
}
这里再介绍一个注解@Spy
相同点
都可以完成一个对象的mock,另外spy和mock生成的对象不受spring管理
不同点
1.默认行为不同
对于未指定mock的方法,spy默认会调用真实的方法,有返回值的返回真实的返回值,而mock默认不执行,有返回值的,默认返回null
也就是说如果没有mock或者
Mockito.when(adminService.insertUser("jack")).thenReturn(1);这样的情况下,被mock的方法会真实执行,像个间谍一样。
但下面的mock就不会执行真正的方法了。
Mockito.doReturn(1).when(adminService).insertUser("jack");
二。启动spring容器,注入对象进行测试
这种方式依赖启动spring容器,启动过程比较长,依赖的对象可以使用spring注解注入
@RunWith(SpringRunner.class)//代表运行在什么测试容器下
@SpringBootTest
public class SpringContextTest {
@Resource
private StuService stuService;
@Test
public void testInsertStu(){
stuService.insertStu("jack");
}
}
三、DAO层单测
这层的单元测试,主要是测试sql,如果我们使用我们真实的测试数据库,会破坏我们的测试数据,这种单元测试我们可以利用内存数据库H2进行单元测试
引入相关jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
<version>1.9.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>
test->resource 下新建配置文件
logging.level.com.ymm.crm=debug
spring.datasource.platform=h2
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;MODE=MySQL
spring.datasource.driver-class-name=org.h2.Driver
#初始化表sql
spring.datasource.schema=classpath:init_table.sql
#单元测试数据
spring.datasource.data=classpath:init_data.sql
spring.datasource.sql-script-encoding=UTF-8
#mybatis配置
mybatis.mapper-locations=classpath:mapper/*.xml
test包下分别新建init_table.sql和init_data.sql,分别是新建表和初始化数据用的
init_table.sql
CREATE TABLE `user` (
`id` varchar(32) NOT NULL,
`version` int(11) NOT NULL DEFAULT 1,
UNIQUE KEY `uk_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
init_data.sql
insert into user(1,1)
test->java 新建测试类,指明dao的路径
@SpringBootApplication(scanBasePackages = "com.test.mapper")
@MapperScan({"com.test.mapper"})
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}
测试类
public class UserMapperTest extends BaseMapperTest {
@Resource
private UserMapper userMapper;
@Test
public void testQueryByCustomerIdAndCurrency(){
userMapper.insert("86");
}
}