关于mockito:一文浅谈Mockito使用-京东云技术团队

一、后期筹备~1、筹备工作<!--mockito依赖-->a<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.7.19</version> <scope>test</scope></dependency><!-- junit依赖 --><dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope></dependency>2、入门常识1)Mockito:简略轻量级的做mocking测试的框架;2)mock对象:在调试期间用来作为实在对象的替代品;3)mock测试:在测试过程中,对那些不容易构建的对象用一个虚构对象来代替测试的办法就叫mock测试;4)stub:打桩,就是为mock对象的办法指定返回值(可抛出异样);5)verify:行为验证,验证指定办法调用状况(是否被调用,调用次数等);3、五分钟入门Demo@Testpublic void test0() { //1、创立mock对象(模仿依赖的对象) final List mock = Mockito.mock(List.class); //2、应用mock对象(mock对象会对接口或类的办法给出默认实现) System.out.println("mock.add result => " + mock.add("first")); //false System.out.println("mock.size result => " + mock.size()); //0 //3、打桩操作(状态测试:设置该对象指定办法被调用时的返回值) Mockito.when(mock.get(0)).thenReturn("second"); Mockito.doReturn(66).when(mock).size(); //3、应用mock对象的stub(测试打桩后果) System.out.println("mock.get result => " + mock.get(0)); //second System.out.println("mock.size result => " + mock.size()); //66 //4、验证交互 verification(行为测试:验证办法调用状况) Mockito.verify(mock).get(Mockito.anyInt()); Mockito.verify(mock, Mockito.times(2)).size(); //5、验证返回的后果(这是JUnit的性能) assertEquals("second", mock.get(0)); assertEquals(66, mock.size());}二、让咱们开始学习吧!1、行为验证• 一旦mock对象被创立了,mock对象会记住所有的交互,而后你就能够选择性的验证你感兴趣的交互,验证不通过则抛出异样。 @Testpublic void test1() { final List mockList = Mockito.mock(List.class); mockList.add("mock1"); mockList.get(0); mockList.size(); mockList.clear(); // 验证办法被应用(默认1次) Mockito.verify(mockList).add("mock1"); // 验证办法被应用1次 Mockito.verify(mockList, Mockito.times(1)).get(0); // 验证办法至多被应用1次 Mockito.verify(mockList, Mockito.atLeast(1)).size(); // 验证办法没有被应用 Mockito.verify(mockList, Mockito.never()).contains("mock2"); // 验证办法至少被应用5次 Mockito.verify(mockList, Mockito.atMost(5)).clear(); // 指定办法调用超时工夫 Mockito.verify(mockList, timeout(100)).get(0); // 指定工夫内须要实现的次数 Mockito.verify(mockList, timeout(200).atLeastOnce()).size();}2、如何做一些测试桩stub• 默认状况下,所有的函数都有返回值。mock函数默认返回的是null,一个空的汇合或者一个被对象类型包装的内置类型,例如0、false对应的对象类型为Integer、Boolean; ...

September 25, 2023 · 5 min · jiezi

关于mockito:mockito-总结

如果测试类是A,被测试方法是funcA@Componentpublic class A { @Autowired private B b; public String funcA(String name) { return b.getName(name, false); }}@Componentpublic class B { public String getName(String name, boolean flag) { return name + ":" + flag; }}如何定义测试类import static org.junit.jupiter.api.Assertions.*;import org.junit.Before;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.mockito.InjectMocks;import org.mockito.Mock;import org.mockito.junit.jupiter.MockitoExtension;import static org.junit.jupiter.api.Assertions.*;import static org.mockito.ArgumentMatchers.anyString;import static org.mockito.ArgumentMatchers.eq;import static org.mockito.BDDMockito.given;import static org.mockito.Mockito.*;@ExtendWith(MockitoExtension.class)class ATest { @InjectMocks private A a; @Mock private B b; @Before public void setUp(){ // 通过反射给属性,常量或者动态变量赋值 } @Test public void test() { String name = a.funcA("name"); assertEquals(name, "name:"); verify(b).getName(anyString(), false); doCallRealMethod().when(a).funcA(anyString()); given(b.getName(anyString(), eq(false))).willReturn("zhangsan"); assertEquals("zhangsan", "name:"); doThrow(new RuntimeException("error msg")).when(b).getName(anyString(), eq(false)); RuntimeException runtimeException = assertThrows(RuntimeException.class, () -> a.funcA("name")); }}

August 16, 2023 · 1 min · jiezi

关于mockito:单元测试利器手把手教你使用Mockito

作者:京东批发 秦浩然 从你成为开发人员的那一天起,写单元测试究竟是你逃不开的宿命!那开发人员为什么不喜爱写单元测试呢?究其原因,无外乎是依赖。依赖其余的服务、依赖运行的环境、等等,各种依赖都成为了咱们写单元测试的绊脚石。那当初有个单元测试利器能够帮咱们解决依赖的问题,你违心应用一下吗?你违心!那就是咱们要学习的Mockito 一、后期筹备~1、筹备工作<!--mockito依赖--><dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>2.7.19</version> <scope>test</scope></dependency><!-- junit依赖 --><dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope></dependency>2、入门常识1)Mockito:简略轻量级的做mocking测试的框架;2)mock对象:在调试期间用来作为实在对象的替代品;3)mock测试:在测试过程中,对那些不容易构建的对象用一个虚构对象来代替测试的办法就叫mock测试;4)stub:打桩,就是为mock对象的办法指定返回值(可抛出异样);5)verify:行为验证,验证指定办法调用状况(是否被调用,调用次数等);3、五分钟入门Demo@Testpublic void test0() { //1、创立mock对象(模仿依赖的对象) final List mock = Mockito.mock(List.class); //2、应用mock对象(mock对象会对接口或类的办法给出默认实现) System.out.println("mock.add result => " + mock.add("first")); //false System.out.println("mock.size result => " + mock.size()); //0 //3、打桩操作(状态测试:设置该对象指定办法被调用时的返回值) Mockito.when(mock.get(0)).thenReturn("second"); Mockito.doReturn(66).when(mock).size(); //3、应用mock对象的stub(测试打桩后果) System.out.println("mock.get result => " + mock.get(0)); //second System.out.println("mock.size result => " + mock.size()); //66 //4、验证交互 verification(行为测试:验证办法调用状况) Mockito.verify(mock).get(Mockito.anyInt()); Mockito.verify(mock, Mockito.times(2)).size(); //5、验证返回的后果(这是JUnit的性能) assertEquals("second", mock.get(0)); assertEquals(66, mock.size());}二、让咱们开始学习吧!1、行为验证• 一旦mock对象被创立了,mock对象会记住所有的交互,而后你就能够选择性的验证你感兴趣的交互,验证不通过则抛出异样。 @Testpublic void test1() { final List mockList = Mockito.mock(List.class); mockList.add("mock1"); mockList.get(0); mockList.size(); mockList.clear(); // 验证办法被应用(默认1次) Mockito.verify(mockList).add("mock1"); // 验证办法被应用1次 Mockito.verify(mockList, Mockito.times(1)).get(0); // 验证办法至多被应用1次 Mockito.verify(mockList, Mockito.atLeast(1)).size(); // 验证办法没有被应用 Mockito.verify(mockList, Mockito.never()).contains("mock2"); // 验证办法至少被应用5次 Mockito.verify(mockList, Mockito.atMost(5)).clear(); // 指定办法调用超时工夫 Mockito.verify(mockList, timeout(100)).get(0); // 指定工夫内须要实现的次数 Mockito.verify(mockList, timeout(200).atLeastOnce()).size();}2、如何做一些测试桩stub• 默认状况下,所有的函数都有返回值。mock函数默认返回的是null,一个空的汇合或者一个被对象类型包装的内置类型,例如0、false对应的对象类型为Integer、Boolean; ...

February 22, 2023 · 5 min · jiezi

关于mockito:Mockito-Junit5

Advanced MockitoController TestA way to capture the information going into the argument of the mock, in other words, to look at the value that is passed in. When there is a class which takes in a property and then modifies that property.Then we can do assertions to make sure that modification of the property which has been passed in is actually correct. OwnerControllerpublic class OwnerController { private final OwnerService ownerService; public String processFindForm(Owner owner, BindingResult result, Model model){ // allow parameterless GET request for /owners to return all records if (owner.getLastName() == null) { owner.setLastName(""); // empty string signifies broadest possible search } // find owners by last name List<Owner> results = ownerService.findAllByLastNameLike("%"+ owner.getLastName() + "%"); if (results.isEmpty()) { // no owners found result.rejectValue("lastName", "notFound", "not found"); return "owners/findOwners"; } else if (results.size() == 1) { // 1 owner found owner = results.get(0); return "redirect:/owners/" + owner.getId(); } else { // multiple owners found model.addAttribute("selections", results); return "owners/ownersList"; } }}OwnerControllerTest@ExtendWith(MockitoExtension.class)class OwnerControllerTest { private static final String OWNERS_CREATE_OR_UPDATE_OWNER_FORM = "owners/createOrUpdateOwnerForm"; private static final String REDIRECT_OWNERS_5 = "redirect:/owners/5"; @Mock OwnerService ownerService; @InjectMocks OwnerController controller; @Mock BindingResult bindingResult; @Test void processCreationFormHasErrors() { //given Owner owner = new Owner(1l, "Jim", "Bob"); given(bindingResult.hasErrors()).willReturn(true); //when String viewName = controller.processCreationForm(owner, bindingResult); //then assertThat(viewName).isEqualToIgnoringCase(OWNERS_CREATE_OR_UPDATE_OWNER_FORM); } @Test void processCreationFormNoErrors() { //given Owner owner = new Owner(5l, "Jim", "Bob"); given(bindingResult.hasErrors()).willReturn(false); given(ownerService.save(any())).willReturn(owner); //when String viewName = controller.processCreationForm(owner, bindingResult); //then assertThat(viewName).isEqualToIgnoringCase(REDIRECT_OWNERS_5); }}ArgumentCaptorA way to capture the information going into the argument of the mock, in other words, to look at the value that is passed in. ...

August 21, 2022 · 4 min · jiezi

JAVA中单元测试的常用方式

什么是单元测试单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。通常来说,程序员每修改一次程序就会进行最少一次单元测试,在编写程序的过程中前后很可能要进行多次单元测试,以证实程序达到软件规格书要求的工作目标,没有程序错误;虽然单元测试不是什么必须的,但也不坏,这牵涉到项目管理的政策决定。单元测试的优点优质的单元测试可以保障开发质量和程序的鲁棒性。在大多数互联网企业中开发工程师在研发过程中都会频繁地执行测试用例,运行失败的单测能帮助我们快速排查和定位问题 使问题在被带到线上之前完成修复。正如软件工程界的一条金科玉律----越早发现的缺陷,其修复成本越低。一流的测试能发现未发生的故障;二流的测试能快速定位故障的发生点;三流的测试则疲于奔命,一直跟在故障后面进行功能回归。JAVA中常用的单元测试工具JUnit/JUnit5https://junit.org/junit5/ junit是老牌测试框架了,也是目前引用最广泛的一个框架。当前已经更新到Junit5,功能更强大。 class StandardTests { @BeforeAll static void initAll() { } @BeforeEach void init() { } @Test void succeedingTest() { } @Test void failingTest() { fail("a failing test"); } @Test @Disabled("for demonstration purposes") void skippedTest() { // not executed } @Test void abortedTest() { assumeTrue("abc".contains("Z")); fail("test should have been aborted"); } @AfterEach void tearDown() { } @AfterAll static void tearDownAll() { }}assertjhttps://assertj.github.io/doc/ 一个功能强悍的断言工具,支持各种断言方式 ...

June 22, 2019 · 2 min · jiezi