2024年使用 mockito 进行单元测试_mochito 值测试(1),软件测试学习教程

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

思考一下,上一个例子当中,我可以把mockedList的第一个数据打印出来吗?按照我们之前的逻辑当然可以,我不是有一个add的操作吗?但是仔细想想,我们模拟的可是List接口啊,都没有指明实现类,难道mockito已经智能到这种程度了吗?当然不是,其实mockito对象只是具备了类的方法,但是调用方法并不会产生真实的数据,我们必须告诉mockito对象执行某种操作后,给我一个什么数据。比如上述代码中,我们执行add操作后,给我返回一个truefalse,好让我控制之后的程序执行路径。

package com.bootdo.app.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.List;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@Slf4j
public class AppNoticeServiceTest {
    @Test
    public void baseOperation() {
        List mockedList = mock(List.class);
        when(mockedList.add(1)).thenReturn(Boolean.FALSE);
        boolean addSuccess = mockedList.add(1);
        if(addSuccess) {
            // 程序略
            log.info("add执行成功");
        } else {
            // 程序略
            log.info("add执行失败");
        }
    }
}

此段代码我们去除了add操作,因为add操作并不是我们真实的目的,真实目的是我们想要控制程序的执行走的路径,达到全覆盖。

验证

验证某一方法是否执行

我们如何验证程序按照我们想要的路径争取执行了呢?可以使用verifyMockito verify方法用于检查是否发生了某些行为,我们可以在测试方法代码的末尾使用Mockito验证方法,以确保调用了指定的方法。

package com.bootdo.app.service.impl;

import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.List;

import static org.mockito.Mockito.*;

@Slf4j
public class AppNoticeServiceTest {
    @Test
    public void baseOperation() {
        List mockedList = mock(List.class);
        when(mockedList.get(1)).thenReturn("one");
        String content =(String) mockedList.get(1);
        if(content.equals("one")) {
            // 程序略
            mockedList.add("two");
        } else {
            // 程序略
            mockedList.add("three");
        }
        verify(mockedList).add("two");
    }
}

我们成功验证了mockedList执行了add("two")方法,证明走了true分支。

验证某一个方法执行次数
 mockedList.add("three times");
 mockedList.add("three times");
 mockedList.add("three times");
 verify(mockedList, times(3)).add("three times");

验证执行顺序
 // A. Single mock whose methods must be invoked in a particular order
 List singleMock = mock(List.class);

 //using a single mock
 singleMock.add("was added first");
 singleMock.add("was added second");

 //create an inOrder verifier for a single mock
 InOrder inOrder = inOrder(singleMock);

 //following will make sure that add is first called with "was added first", then with "was added second"
 inOrder.verify(singleMock).add("was added first");
 inOrder.verify(singleMock).add("was added second");

两个类的执行顺序

 // B. Multiple mocks that must be used in a particular order
 List firstMock = mock(List.class);
 List secondMock = mock(List.class);

 //using mocks
 firstMock.add("was called first");
 secondMock.add("was called second");

 //create inOrder object passing any mocks that need to be verified in order
 InOrder inOrder = inOrder(firstMock, secondMock);

 //following will make sure that firstMock was called before secondMock
 inOrder.verify(firstMock).add("was called first");
 inOrder.verify(secondMock).add("was called second");

验证类的所有模拟方法是否都被验证了

这个方法很难理解,而且网上的资料大多数都是直译官网,非常难以理解。以下我们通过一个例子来理解一下:

public class Test {
    public String method1(){return "method1";}
    public String method2(){return "method2";}
}
public class MockTest {
    public static void main(String[] args) {
        Test test = mock(Test.class);
        test.method1();
        verifyNoMoreInteractions(test);
    }
}

以上调用了test.method1()但是却没有验证该结果,所以会报错。

public class MockTest {
    public static void main(String[] args) {
        Test test = mock(Test.class);
        test.method1();
        verify(test).method1();
        verifyNoMoreInteractions(test);
    }
}

以上的程序虽然仅仅掉了test的method1方法,没有调用test的method2方法,但是却在调用method1之后,进行了验证了执行次数(默认为1),所以verifyNoMoreInteractions就不会报错了

参数匹配

如果一个方法需要填写参数,但是输入什么参数并不是很重要,重要的是他的返回值,那么你可以使用参数匹配。

when(mockedList.get(anyInt())).thenReturn("element");

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

真正的技术提升。**

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mockito 是一个基于 Java 的开源单元测试框架。使用 Mockito进行单元测试可以让您更轻松地编写和运行测试,而无需实际依赖于所有可能的外部依赖项。 以下是一个简单的使用 Mockito 进行单元测试的步骤: 1.添加 Mockito 依赖项到您的 pom.xml 文件中。这可以通过下面的代码完成: <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.25.1</version> <scope>test</scope> </dependency> 2.创建一个包含一些需要测试的方法的 Java 类。 3.在测试类中创建一个 Mock 对象,并使用 Mockito.when() 方法模拟对象的行为。 4.使用 assertEquals() 断言来比较模拟的对象的预期结果与实际结果是否一致。 这里是一个使用 Mockito 进行单元测试的示例: public class CalculatorTest { @Mock private CalculatorService calculatorService; private Calculator calculator; @Before public void setUp(){ MockitoAnnotations.initMocks(this); calculator = new Calculator(calculatorService); } @Test public void testAdd(){ when(calculatorService.add(2,3)).thenReturn(5); assertEquals(10, calculator.perform(2,3)); } } 在这个示例中,我们模拟了一个 CalculatorService 对象,并在测试方法中调用了 calculator.perform(2,3) 方法。当我们调用 add() 方法时,它会返回 5,我们使用 assertEquals() 来确保实际结果等于预期结果。 注意:在上面的示例中,我们在 setUp() 方法中初始化了 Mockito,以确保 Mock 对象已正确注入。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值