美文网首页
代码单元测试二

代码单元测试二

作者: supremecsp | 来源:发表于2022-03-02 16:51 被阅读0次

对于代码中涉及到外部资源,包括文件、数据库、中间件、第三方服务等等,需要怎么编写单元测试?

临时文件
为了保证测试是可以重复执行的,我们要确保所有的资源在执行之后要恢复原样。对于文件这种外部资源,JUnit给予一个标准答案:临时文件。
更准确地说,JUnit 给出的方案是临时目录,在这个目录里,你怎么折腾都行。我们只要给一个变量标记上 @TempDir


class FileTodoItemRepositoryTest {
    @TempDir
    File tempDir;
    private File tempFile;
    private FileTodoItemRepository repository;
    
    @BeforeEach
    void setUp() throws IOException {
        this.tempFile = File.createTempFile("file", "", tempDir);
        this.repository = new FileTodoItemRepository(this.tempFile);
    }
    
    @Test
    public void should_find_nothing_for_empty_repository() throws IOException {
        final Iterable<TodoItem> items = repository.findAll();
        assertThat(items).hasSize(0);
    }
    ...
}

Mock 框架
对于不可控的组件,如何将其可控化?
第一步自然是隔离,第二步就是用一个可控的组件代替不可控的组件。换言之,用一个假的组件代替真的组件。Mock 框架可以完成代替的任务
Mock 框架最核心的两个点:设置模拟对象与校验对象行为。
模拟对象的设置核心就是两点:参数是什么样的以及对应的处理是什么样的。
接下来简单演示Mock 框架的处理流程
1,代码进行初始化

public class XXXTest {
    @Autowired
    private XXXServiceImpl xxxService;

    private XXXApi xxxApi;

    @Before
    public void setUp() {
        this.xxxApi= mock(XXXApi.class);
        xxxService.setXXXApi(xxxApi);
    }

2,判断参数是什么样的以及对应的处理是什么样的
如像下面,对方法getDeviceFamilyRelations不管传入什么参数,都返回特定的对象

when(xxxApi.getDeviceFamilyRelations(any())).thenReturn(commonGenericResultRes);

3,校验对象行为
模拟对象的另外一个重要行为是校验对象行为,就是知道一个方法有没有按照预期的方式调用。比如,我们可以预期 save 函数在执行过程中得到了调用。

verify(repository).save(any());

集成测试
当单元测试不太能满足测试需求时,比如用到数据,第三方库,组件间的协同测试等。可以考虑把框架集成进来,做一个完整的集成测试。
SpringBootTest & RunWith
SpringBootTest启动spring容器,意思为接下来的测试是把所有组件都集成起来的集成测试。@SpringBootTest与@RunWith这两个是配合使用的
Transactional
@Transactional,说明这个测试是事务性的,在缺省的测试事务中,执行完测试之后,数据是要回滚,也就是不对数据库造成实际的影响。
TestPropertySource
这是在用 classpath 上的 test.properties 这个文件中的配置,去替换掉我们缺省的配置(也就是我们真实的数据库)
WebMvcTest
@WebMvcTest是Spring 提供了模拟的 Web 环境。 执行速度相对于 @SpringBootTest 这种集成了所有组件的做法而言要快一些。配合@MockBean使用

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SceneManageApplication.class)
@Transactional
@TestPropertySource("classpath:application.yml")
public class SceneRoomRelationServiceTest {

相关文章

  • 内存中完成:图片压缩+Base64编码

    一、引入thumbnailator maven: gradle: 二、单元测试代码

  • 代码单元测试二

    对于代码中涉及到外部资源,包括文件、数据库、中间件、第三方服务等等,需要怎么编写单元测试? 临时文件为了保证测试是...

  • 需“软件质量工作总结-2”

    1、初步完成 1)独立输出异常类单元测试代码 2)单元测试代码总输出异常的行号 3)异常类单元测试代码永久抛出异常

  • 理解单元测试

    单元测试 在Java中单元测试指代码单元的测试用例,代码单元指类中的方法。单元测试是用以保证代码的逻辑正确性,测试...

  • 关于单元测试

    什么是单元测试: 单元测试从本质上讲也是代码,与普通代码的区别是,它是验证代码正...

  • 单元测试之道Java版本读后记录

    一、什么是单元测试 单元测试是开发者编写的一段代码,用于检验被测代码的一个很小的、很明确的功能是否正确 二、测试哪...

  • 打印方法运行时间

    方法一 方法二 方法三 方法四添加单元测试,在单元测试方法中添加代码,按Command+U运行测试,控制台会打印出...

  • 单元测试

    1、什么是单元测试 单元测试是一种通过代码检测代码的开发手段,常用于敏捷开发和测试驱动开发; 单元测试主要针对业务...

  • Junit单元测试入门

    什么叫单元测试 单元测试可以提高代码质量与开发效率。 main单元测试与junit单元测试的比较 传统的main方...

  • 尽量避免bug的一些方法

    与产品经理和有经验的测试多沟通(需求阶段,代码设计阶段) 代码开发阶段-- 必须写单元测试并且同步维护单元测试代码...

网友评论

      本文标题:代码单元测试二

      本文链接:https://www.haomeiwen.com/subject/qdferrtx.html