工作记录------单元测试(持续更新)

这篇具有很好参考价值的文章主要介绍了工作记录------单元测试(持续更新)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

工作记录------单元测试

之前的工作中从来没有写过单元测试,新入职公司要求写单元测试,
个人觉得,作为程序员单元测试还是必须会写的
于此记录一下首次编写单元测试的过程。

首先引入单元测试相关的依赖

       <dependency>
            <groupId>org.mockito</groupId>
            <artifactId>mockito-all</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

其次创建test目录

在src目录下,创建与main同级的目录。
工作记录------单元测试(持续更新),入职,单元测试,log4j
其中test/java目录下编写测试类
test/resources目录下放置测试所需要的配置文件。
工作记录------单元测试(持续更新),入职,单元测试,log4j
test/java与main/java目录层级结构保持一致。
工作记录------单元测试(持续更新),入职,单元测试,log4j
区别在于测试类以Test结尾。

测试类编写

@RunWith(MockitoJUnitRunner.class)
public class ATest {
    private static final Logger LOGGER = LoggerFactory.getLogger(A.class);

    @InjectMocks
    private A a;

    @Mock
    private B b;

    @Mock
    private C c;

    @Mock
    private D d;

    @Mock
    private E e;

    @Mock
    private F f;

    private H h = new H();

    @Test
    public void testGetType() {
        Enum type = a.getType();
        boolean equals = type.equals(Enum.SAVE);
        Mockito.when(d.d(Mockito.anyString(), Mockito.any(), Mockito.any())).thenReturn("123456789");
        AppLogUtil.info(LOGGER, "Enum.SAVE result:{}", equals);
    }

	@Before
    public void init() {
        MockitoAnnotations.initMocks(this);
        f.setB("aaa");
    }

首先在文件头声明这是一个测试类:@RunWith(MockitoJUnitRunner.class)
这是一个A类的测试类,所以文件名为ATest。
@InjectMocks
作用是:注入mock
意味着在测试过程中进入A类时,A类中所涉及的引用都是有值的,不为null,指的是A类中的(B-F)。
@Mock:
就是模拟这个引用的依赖,用于Test类
@Before
执行@Test方法前,先执行的步骤,一般用于参数构建,以及mock注入:MockitoAnnotations.initMocks(this);这句话与@InjectMocks相结合使用,表明注入模拟A类。
@Test:
指的是拥有这个注解的方法就是测试方法,通过这个方法对A类中的具体方法进行测试,而方法名一般为“test方法名”。需要传递参数的话,就需要先构建对应的参数。
而由于A类中涉及到了很多依赖的调用,此时我们也需要mock返回参数,使得流程能正常的跑下去。
由此能够看出,单元测试只针对当前一个方法的逻辑,不会延伸到引用调用的方法。
当遇到其他引用的方法调用时,也需要mock,比如执行到D类的d方法,就需要Mockito.when(d.d(Mockito.anyString(), Mockito.any(), Mockito.any())).thenReturn(“123456789”);根据这个语句能够看出,d方法需要三个参数,该方法需要几个参数,就传入几个参数。thenReturn代表模拟的返回值。

问题:如果在A类中,调用B引用的select方法,两次,一次返回null,一次返回有值,应该怎么操作?

答案:

Mockito.when(B.select(Mockito.anyString())).thenReturn(null).thenReturn(dto);
通过两次thenReturn方法,第一次则会返回第一次thenReturn的结果,第二次会返回第二次thenReturn的结果
此时dto需要自行new

230831日记录

首先明确init()方法
这个方法里添加写的应该是当前测试类,需要公共注入的配置,单个方法用到的注入配置,就应该放到测试方法中,单独声明

@Before
    public void init() {}

遇到问题,如何链式调用mock

遇到调用redis模版的方法。需要mock,但mock一直不通过,启动测试方法时会报异常

NullpointerException

回到测试类中。发现自己引入时,是这样的写法。

Mockito.when(redisTemplate.opsForValue().increment(Mockito.anyString(), Mockito.any())).thenReturn(1l);

回到原代码,原始代码如下,此处的key是个固定值

redisTemplate.opsForValue().increment(key, -1l);

发现这样mock是无效的,缺少对应的引用,因为mock引用时,也只引用了stringRedisTemplate,对于stringRedisTemplate.opsForValue()方法缺少返回值。

@Mock
    private StringRedisTemplate redisTemplate;

后经过指点遇到链式调用时,需要都mock

    @Mock
    private StringRedisTemplate redisTemplate;

    @Mock
    ValueOperations<String, String> valueOperations;
    
	@Before
    public void init() {
        MockitoAnnotations.initMocks(this);
    
  Mockito.when(redisTemplate.opsForValue()).thenReturn(valueOperations);
        //此时的key = "123",需要和真实代码中使用相同的key
        Mockito.when(redisTemplate.increment("123",-1)).thenReturn(1L);
    }

注意点

当我们使用Mockito.when,来表明执行到该方法时,调用mock的方法,和返回mock的结果。
此时传入的参数,应该和业务代码中保持一致,而不是简单的使用Mockito.anyString()、Mockito.any()随意应付的写传入任意参数。文章来源地址https://www.toymoban.com/news/detail-626386.html

Mockito.when(mybkService.queryDetail("1111","1111",null,"1111","1111","1111",1,1)).thenReturn(StudVo);

到了这里,关于工作记录------单元测试(持续更新)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • log4j官方漏洞修复史(更新至2.17.1/CVE-2021-44832)

    自从log4j2.14.1版本爆出漏洞后,官方截止目前为止,共发布了3个稳定版本,分别是15.0、16.0、17.0。 本篇文章就分析一下每个版本都做了哪些事情,以此来评估每个版本升级的必要性。 分割线--------------------------------------------------------------------------------------- 在28号晚上,log4

    2024年02月07日
    浏览(36)
  • 【实战】一次简单的log4j漏洞测试

    更新时间:2021.12.19 参考文档:https://www.yuque.com/u8021480/crow/dg9xax 在去年 log4j 漏洞刚爆发的时候,很多平台都存在漏洞,当时也在第一时间在有授权的情况下对某论坛进行了渗透测试,结果发现存在漏洞,报告之后,漏洞也被很快修复。 本次对该渗透过程进行一个简单的记录

    2023年04月26日
    浏览(37)
  • 小样本学习系列工作(持续更新)

    有关小样本学习的各类文章通常会将其方法分成几个大类:基于度量学习的小样本方法、基于数据增强的小样本学习方法和基于模型初始化的小样本学习方法。我觉得这样分类并不好,因为三种方法之间并不是各自独立存在的,大多数情况下都是有交集的,比如一篇工作可能

    2024年01月22日
    浏览(21)
  • 爬虫学习记录(持续更新)

    1.使用webdriver报错 AttributeError: \\\'str\\\' object has no attribute \\\'capabilities\\\' 解决:目前使用的selenium版本是4.11.2,可以不必设置driver.exe的路径,selenium可以自己处理浏览器和驱动程序,因此,使用Selenium Webdriver创建对象

    2024年02月13日
    浏览(30)
  • 软件使用错误(警告)记录(持续更新)

     本博客用以记录在软件使用过程中所遇到的错误和关键性的警告,以及这些警告和错误的解决方法,方便日后查看以及能为其他遇到同样问题的人提供一个可能的解决方法。需要注意的是,此处记录的方法是根据本人遇到的问题记录的,所以在解决自己遇到的问题的时候需

    2023年04月08日
    浏览(39)
  • react hook问题记录(持续更新)

    实际使用react hook的时候遇到的一些问题记录下来了,温故而知新。 例子1:界面上有个按钮,点击按钮界面上数值会增加1和2 但是实际的结果是: 点击按钮,界面展示的是 0,2。跟预期需要展示的0,1,2不一样 例子2:点击按钮,执行三次setState,希望加3 但是实际的结果是:

    2024年01月15日
    浏览(24)
  • sentinel踩坑记录——持续更新ing

    自定义被限流的后续操作@SentinelResource(blockHandler = \\\"blockHandler\\\"),其中blockHandler处理函数不执行 前置条件  定义好资源和流控规则之后,如果每秒访问超过2个请求,那么就会触发流控,从而应该执行 blockHandler(int a, BlockException e) 方法,但是实际情况是即使触发了流控规则依然

    2024年02月05日
    浏览(37)
  • 微信产品对接问题记录集锦(持续更新)

         1.商户平台中进行关联订阅号操作,显示:当前商户号暂不支持关联该类型的appid      2.微信支付接入前需要的配置信息      3.商户平台中添加JSAPI支付授权目录操作中添加之后没有显示问题      4.基于微信中的H5项目对应的支付方式是哪种,需要哪些配置信息   

    2024年02月09日
    浏览(39)
  • 【持续更新】C/C++ 踩坑记录(一)

    下面这段代码中 is_valid() 解引用了空指针 str ,我们的直觉是编译运行后将迎来 SIGSEGV,然而事情并非所期望的那样。 结合 GCC 发出的警告,不难推断出条件表达式 *str == 0x80 在编译期被求值且相应的 if 语句被优化掉了,而且这是在 O0 的优化等级下。以下的反汇编结果验证了

    2024年02月16日
    浏览(44)
  • SQLServer 常用命令记录,持续更新.....(有问题可以留言)

       在SQL Server中,您可以使用内置的JSON功能来操作JSON数据。SQL Server 2016及更高版本引入了对JSON的原生支持。以下是一些常见的JSON操作: JSON数据的查询: 使用 JSON_VALUE 函数来提取JSON对象中的特定属性值。 使用 JSON_QUERY 函数来提取JSON对象或数组。 使用 JSON_UNQUOTE 函数来删除

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包