单元测试编写方法

PowerMock介绍
https://www.jianshu.com/p/60309d71002d

单元测试编写方法来编写单元测试的简要小教程

单元测试的最终目的是达到足够高的代码覆盖率

我们需要测试的一般为serviceimpl实现类中的方法,在该类中使用到的maven或gradle导入的第三方jar包,以及经过了他们自己的测试,我们默认他正确,不需要进行测试

我们自己编写的工具类方法,在impl中视具体情况而定,如果工具类的方法逻辑非常复杂,那么建议把工具类也写一个单元测试,然后在impl中将其mock掉,如果工具类不复杂,就可以直接在impl中调用真实工具类逻辑,完成测试

代码结构:

@Slf4j
@PrepareForTest(value = {ShadowAppServiceImpl.class, ResultDTO.class,LambdaQueryWrapper.class, LambdaUpdateWrapper.class})
@RunWith(PowerMockRunner.class)

public class ShadowAppServiceImplTest extends BaseServiceTest {

//需要进行单测的对象
private ShadowAppService Shadow AppService;

//单测对象构造方法所需要的参数

private Shadow Mapper Shadow Mapper;

/*

还有serviceimpl中的其他的类成员也在此处定义

*/

//这两个wrapper主要对应数据库的操作,继承了BaseServiceTest之后,可用这两个wrapper去做mybatis中的增删查改

private LambdaQueryWrapper lambdaQueryWrapper;

private LambdaUpdateWrapper lambdaUpdateWrapper;

@Before
public void setUp() throws Exception {

/*

mock掉impl其中的对象,并用mock掉的对象构建出我们需要单测的实例

*/

Shadow Mapper = PowerMockito.mock(ShadowMapper.class);
ShadowAppService = PowerMockito.spy(new ShadowAppServiceImpl(Shadow Mapper));

/*

wrapper的初始化,相当于对这两个wrapper进行了mock

*/

lambdaQueryWrapper = queryLambdaPrepare(lambdaQueryWrapper);
lambdaUpdateWrapper = updateLambdaPrepare(lambdaUpdateWrapper);

/*

通过反射给类中的域进行赋值

*/

ReflectionTestUtils.setField(Shadow AppService, “ShadowMapper”, Shadow Mapper);

}

这就做好了单测的基本准备工作,mock的作用在于构造出我们难以构造的对象,我们可以给mock的对象指定对给定输入的特定输出,一般情况下impl中的对象均需要进行mock,但有些例外需要使用真实对象,比如线程池

例如:PowerMockito.when(redissonClient.getBucket(any(String.class))).thenReturn(bucket);

对于没有返回值的情况,使用 Mockito.doNothing().when(Shadow Mapper).updateByCode(any(Shadow Po.class));

通过这种方式,达到使函数朝着不同方向继续往下运行的目的

有时遇到了函数的假参数或者假返回值非常难以构造的情况,这时可以把参数或返回值也进行mock,中间层皆可mock掉,直到遇到好构造的结构为止

接下来开始编写函数的单测代码,首先要确定,哪些函数需要编写单测代码。我们只编写最顶层的函数的单测,如果一个函数被另一个函数所调用,那么他就不用编写单测,而在他被调用的情况下,你需要进入到他内部,

走他的逻辑。

然后要确定函数的多个分支涉及到的不同情况应该如何处理,有的时候可以用同一个单测代码对应不同的测试用例来覆盖到多分支,有的时候需要人为mock不同的假参数和假返回值来覆盖不同分支,这些需要在编写的时候

考虑清晰,才能做到全部覆盖。

对于难以构造的dto,比如层数很多需要逐层构造的,可以使用从resources中读取json文件的方法进行构造,这样只需要复制粘贴修改里面的值即可完成新对象的创建

异常状态的代码我们也需要覆盖到,通过构造数据手动的触发异常,然后利用try catch进行捕获,即可覆盖到异常的代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Terraform是一种基础架构即代码的工具,它可以帮助你自动化创建、修改和删除基础架构资源。在编写Terraform代码时,单元测试是非常重要的,因为它可以帮助你确保你的代码在生产环境中能够正常工作。下面是编写Terraform单元测试的步骤: 1. 安装Terraform 首先,你需要安装Terraform。你可以去Terraform的官方网站下载适合你系统的二进制文件并安装。 2. 安装Terratest Terratest是一个用于编写Terraform测试的Go库。你需要安装它,可以通过以下命令来安装: ``` go get -u github.com/gruntwork-io/terratest/modules/terraform ``` 3. 编写测试代码 接下来,你需要编写测试代码。一个基本的测试代码应该包括以下几个步骤: - 初始化Terraform代码 - 执行Terraform计划 - 确认计划的正确性 - 执行Terraform应用 - 确认应用的正确性 以下是一个简单的示例,用于测试创建AWS EC2实例的Terraform代码: ``` package test import ( "testing" "github.com/gruntwork-io/terratest/modules/aws" "github.com/gruntwork-io/terratest/modules/terraform" "github.com/stretchr/testify/assert" ) func TestTerraformAwsEc2(t *testing.T) { terraformOptions := &terraform.Options{ TerraformDir: "../terraform/aws-ec2", } defer terraform.Destroy(t, terraformOptions) terraform.InitAndApply(t, terraformOptions) publicIp := aws.GetPublicIpOfEc2Instance(t, terraformOptions, "example") assert.NotEmpty(t, publicIp) } ``` 4. 运行测试 最后,你需要运行测试。可以使用以下命令来运行测试: ``` go test -v ``` 这将运行你的测试并输出详细信息。如果测试通过,你的Terraform代码就可以在生产环境中安全地使用了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值