关于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