单元测试

一。使用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");
    }
}

 

posted @ 2023-04-07 15:04  qiushui  阅读(59)  评论(0)    收藏  举报