Mockito常用方法
- 格式:docx
- 大小:48.60 KB
- 文档页数:17
mockito使用用例使用Mockito进行单元测试的用例引言:在软件开发过程中,单元测试是非常重要的环节,它可以确保代码的质量和稳定性。
Mockito是一个开源的Java单元测试框架,它可以帮助我们方便地创建和管理模拟对象,从而使单元测试更加简单和高效。
本文将介绍Mockito的基本使用方法,并通过几个用例来展示其强大的功能。
用例一:模拟对象的创建和方法调用假设我们有一个名为UserService的类,其中有一个名为getUserInfo的方法,该方法调用了一个外部的UserDao对象的getUserById方法来获取用户信息。
我们希望对getUserInfo方法进行单元测试,但是又不想依赖于真实的UserDao对象,这时就可以使用Mockito来创建一个模拟的UserDao对象。
在测试类中引入Mockito框架:```import static org.mockito.Mockito.*;```然后,创建一个模拟的UserDao对象:```UserDao userDao = mock(UserDao.class);```接下来,我们可以使用when-thenReturn语法来指定当调用getUserById方法时,应该返回什么值:```when(userDao.getUserById(1)).thenReturn(new User(1, "John"));```通过创建一个UserService对象,并调用getUserInfo方法,我们可以验证getUserInfo方法是否正确地调用了模拟的UserDao对象的getUserById方法,并返回了正确的用户信息:```UserService userService = new UserService(userDao);User user = userService.getUserInfo(1);assertEquals("John", user.getName());```用例二:模拟抛出异常有时候,我们希望模拟对象在某些情况下抛出异常,以测试代码在异常情况下的处理逻辑。
mockito thenthrow用法-回复Mockito是一个流行的Java库,用于编写单元测试时模拟对象的行为。
其中一个常用的功能是使用thenReturn和thenThrow模拟方法调用的返回值或抛出异常。
在本文中,我们将逐步介绍thenReturn和thenThrow的用法,并提供一些示例来说明它们的作用。
1. 什么是thenReturn和thenThrow?thenReturn和thenThrow是Mockito库提供的两种方法,用于模拟方法的行为。
thenReturn方法用于模拟方法调用的返回值,而thenThrow方法用于模拟方法调用时抛出的异常。
2. 如何使用thenReturn和thenThrow?在使用Mockito进行单元测试时,我们可以利用thenReturn和thenThrow方法来模拟方法调用的返回值或抛出的异常。
下面我们将详细介绍如何使用这两个方法。
2.1 使用thenReturn方法模拟方法调用的返回值为了模拟一个方法调用的返回值,我们需要按照以下步骤操作:步骤1:创建被模拟对象首先,我们需要创建一个被模拟的对象,可以是一个类的实例或者一个接口。
javaUserService userService = Mockito.mock(UserService.class);步骤2:设置模拟方法的返回值接下来,我们可以使用thenReturn方法为方法调用设置返回值。
javaMockito.when(userService.getUserById(Mockito.anyString())).then Return(new User("123", "John"));上述代码中,我们使用anyString方法作为getUserById方法的参数,表示无论传入什么字符串,都将返回一个新的User对象。
步骤3:进行方法调用并验证结果最后,我们可以对被模拟对象的方法进行调用,并验证返回的结果是否符合预期。
mockito mock对象里面某个对象的方法摘要:1.介绍Mockito框架2.什么是Mock对象3.如何在Mockito中创建和使用Mock对象4.如何在Mockito中模拟对象的方法5.实战案例:使用Mockito优化代码6.总结正文:近年来,随着软件测试的深入人心,越来越多的开发者开始使用模拟对象来进行单元测试。
Mockito是一款流行的Java模拟框架,可以帮助我们更轻松地编写高质量的测试代码。
本文将介绍如何在Mockito中创建和使用Mock 对象,以及如何模拟对象的方法。
1.介绍Mockito框架Mockito是一个开源的Java框架,用于创建和配置模拟对象,以简化单元测试。
Mockito的核心功能是模拟对象的行为,允许我们在测试中替换真实对象,以便更好地控制测试过程中的依赖关系。
Mockito具有丰富的API和较高的可扩展性,可以满足各种复杂的测试需求。
2.什么是Mock对象在单元测试中,Mock对象是指一个被替换的真实对象,它具有可控的行为。
通过模拟真实对象的行为,我们可以更容易地编写测试用例,并验证代码的正确性。
Mock对象主要有三种类型:基本类型、集合类型和接口类型。
3.如何在Mockito中创建和使用Mock对象要在Mockito中创建Mock对象,首先需要导入相关的依赖。
然后,使用`@Mock`注解标注需要模拟的对象,并在构造函数中注入Mock对象。
以下是一个简单的示例:```javaimport org.mockito.Mock;import org.mockito.MockitoAnnotations;public class TestClass {@Mockprivate SomeService someService;public TestClass() {MockitoAnnotations.initMocks(this);}public void someMethod() {someService.doSomething();}}```4.如何在Mockito中模拟对象的方法在创建好Mock对象后,我们可以使用`when()`、`thenReturn()`等方法来模拟对象的方法行为。
mockito 方法Mockito是一个开源的Java测试框架,它提供了一种简单且灵活的方式来创建模拟对象(mock object),并进行单元测试。
Mockito的核心思想是通过模拟对象来隔离被测对象的依赖,并对被测对象的行为进行断言。
本文将介绍Mockito框架的基本使用方法以及一些常见的Mockito方法。
首先,为了能够使用Mockito框架,我们需要在项目的依赖管理中引入Mockito库。
可以使用Maven等构建工具,在项目的pom.xml文件中添加如下依赖:```xml<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>2.28.2</version></dependency>```添加完依赖后,我们就可以开始使用Mockito框架了。
1. 创建模拟对象使用Mockito框架创建模拟对象非常简单。
可以使用`mock()`方法创建一个空的模拟对象,例如:```javaList<String> mockedList = Mockito.mock(List.class);```在上述代码中,我们创建了一个类型为`List<String>`的模拟对象`mockedList`。
通过这个模拟对象,我们可以模拟出`List`接口的行为,并在单元测试中对其进行断言。
2. 设置模拟对象的返回值创建了模拟对象后,我们可以使用`when()`方法来设置模拟对象的方法调用返回值。
例如:```javawhen(mockedList.size()).thenReturn(2);```在上述代码中,我们设置了当模拟对象的`size()`方法被调用时,返回值为2。
3. 验证方法的调用Mockito提供了`verify()`方法来验证方法是否被调用。
mockito 用法
Mockito是一个用于Java单元测试的Mock框架,它可以帮助开发人员轻松地创建和管理 Mock 对象,从而实现更可靠和可维护的测试。
Mockito 的基本用法包括:
1. 创建 Mock 对象:使用 Mockito.mock() 方法创建 Mock 对象,该对象可以模拟某个类的行为并返回特定的值。
2. 设置 Mock 对象的行为:使用 Mockito.when() 方法设置Mock 对象的行为,例如返回指定的值、抛出异常等。
3. 验证 Mock 对象的行为:使用 Mockito.verify() 方法验证Mock 对象的行为是否符合预期,例如是否执行了某个方法、是否传入了指定的参数等。
4. 高级用法:Mockito 还提供了许多高级用法,例如使用注解简化 Mock 对象的创建、设置 Mock 对象的默认行为、创建 Spy 对象等。
Mockito 的使用可以大大简化单元测试的编写和维护工作,同时也可以提高测试的覆盖率和准确性。
- 1 -。
mockitojunitrunner的用法MockitoJUnitRunner是Mockito框架中提供的JUnit运行器,它用于简化使用Mockito进行单元测试的过程。
Mockito是一个用于创建和配置mock对象的Java测试框架,MockitoJUnitRunner允许您在JUnit 测试中轻松使用Mockito。
以下是MockitoJUnitRunner的基本用法和一些常见的示例:1. 引入依赖首先,您需要在项目中引入Mockito库的依赖。
如果使用Maven,可以在pom.xml文件中添加以下依赖:<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>3.x.x</version> <!--请使用最新版本--><scope>test</scope></dependency>如果使用Gradle,可以在build.gradle文件中添加以下依赖:testImplementation 'org.mockito:mockito-core:3.x.x'// 请使用最新版本2. 使用MockitoJUnitRunner在编写JUnit测试类时,可以使用MockitoJUnitRunner来运行测试。
以下是一个简单的示例:import org.junit.Test;import org.junit.runner.RunWith;import org.mockito.InjectMocks;import org.mockito.Mock;import org.mockito.junit.MockitoJUnitRunner;@RunWith(MockitoJUnitRunner.class)public class MyServiceTest {@Mockprivate MyDependency myDependency;@InjectMocksprivate MyService myService;@Testpublic void testDoSomething(){// 模拟myDependency的行为when(myDependency.someMethod()).thenReturn("Mocked R esult");// 调用被测试的方法String result =myService.doSomething();// 验证结果assertEquals("Expected Result",result);verify(myDependency).someMethod();}}在这个例子中,MockitoJUnitRunner.class作为@RunWith注解的参数,告诉JUnit使用Mockito运行测试。
Mockito学习(1)---快速⼊门Mockito是⼀个模拟测试框架,可以让你⽤优雅,简洁的接⼝写出漂亮的单元测试。
Mockito可以让单元测试易于可读,产⽣简洁的校验错误。
1、如何使⽤Mockito引⼊mavne依赖<dependency><groupId>org.mockito</groupId><artifactId>mockito-core</artifactId><version>2.23.4</version><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency>有三种⽅法可以配置使⽤Mockito:MockitoJUnitRunner 注解接下来主要⽤这种⽅法来介绍import org.junit.runner.RunWith;import org.mockito.junit.MockitoJUnitRunner;import org.mockito.Mock;// 测试类加上 @RunWith(MockitoJUnitRunner.class) 注解@RunWith(MockitoJUnitRunner.class)public class MockByRunnerTest {@Mockprivate AccountDao accountDao;}MockitoAnnotations ⽅式import org.mockito.MockitoAnnotations;import org.mockito.Mock;import org.junit.Before;public class MockByAnnotationTest {@Mockprivate AccountDao accountDao;@Beforepublic void init(){// 初始化MockitoAnnotations.initMocks(this);}}@Rule 注解import org.junit.Rule;import org.mockito.Mock;public class MockByRuleTest {// 初始化@Rulepublic MockitoRule mockitoRule = MockitoJUnit.rule();@MockAccountDao accountDao;}2、什么是Mock测试mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,⽤⼀个虚拟的对象来创建以便测试的测试⽅法。
mockito方法
Mockito是一种Java开发中常用的测试框架,用于模拟对象的行为。
它可以帮助开发人员编写更容易测试和维护的代码。
Mockito提供了一系列的方法,用于模拟方法的行为。
下面是一些常用的Mockito方法:
1. mock()方法:用于创建一个模拟对象。
通过调用该方法并传入一个类或接口的class对象,可以返回一个实现了该类或接口的模拟对象。
2. when()方法:用于指定模拟对象在特定条件下的行为。
可以通过when方法来模拟方法的返回值、抛出异常以及进行链式调用等操作。
3. verify()方法:用于验证模拟对象的方法调用情况。
通过调用verify方法并传入模拟对象,可以验证该模拟对象的方法是否被调用,以及调用的次数和顺序等。
4. any()方法:用于模拟方法的参数。
当测试方法中的参数没有特定要求时,可以使用any方法来模拟任意参数值。
5. times()方法:用于指定方法调用的次数。
可以通过times方法来验证方法被调用的具体次数,例如times(1)表示方法被调用一次。
6. doNothing()方法:用于指定无返回值的方法不执行任何操作。
可以通过doNothing方法来模拟无返回值的方法,使其在测试过程中不执行任何操作。
以上是Mockito的一些常用方法,通过使用这些方法,开发人员可以方便地进行单元测试和验收测试,提高代码的质量和可测试性。
Mockito的简洁、灵活和易于使用的特点使其成为开发人员喜爱的测试框架。
mockitojunitrunner常用方法MockitoJUnitRunner是Mockito框架中提供的JUnit运行器,用于简化Mockito与JUnit的集成和使用。
使用MockitoJUnitRunner可以通过注解的方式创建和管理Mock对象,并提供了一系列方便的方法来进行Mock对象的行为设定和验证。
1. `@Mock`: 用于标记需要被Mock的对象。
使用此注解可以自动创建并注入一个Mock对象。
例:```@Mockprivate UserService userService;```2. `@InjectMocks`: 用于标记需要被注入Mock对象的被测类对象。
使用此注解可以自动将被标记的对象中的所有被`@Mock`标记的对象注入进来。
例:```@InjectMocksprivate UserController userController;```3. `@Before`: 用于标记初始化方法,在每个测试方法执行之前执行。
可以在此方法中进行一些初始化操作。
例:```@Beforepublic void setUp() {MockitoAnnotations.initMocks(this);}```4. `when()`: 用于设定Mock对象的行为。
通过`when()`方法可以设定当特定的方法被调用时,Mock对象应该返回的值。
例:```when(userService.getUserById(1)).thenReturn(new User("Alice")); ```5. `verify()`: 用于验证Mock对象的方法被调用的情况。
通过`verify()`方法可以验证Mock对象的某个方法被调用的次数、参数等。
例:```verify(userService, times(1)).getUserById(1);```6. `any()`: 用于匹配任意类型的参数。
mockito 用法Mockito是一个Java框架,用于创建mock对象,以便在单元测试中进行测试。
Mockito旨在简化单元测试的创建,并提供了一种易于使用的方式来模拟依赖项。
Mockito是一个流行的测试框架,因为它易于学习和使用。
以下是Mockito的一些用法:1.创建mock对象在Mockito中,可以使用mock()方法来创建mock对象。
例如,以下代码将创建一个名为'myList'的mock对象:List<String> myList = mock(List.class);2.指定mock对象的行为使用when()和thenReturn()方法可以指定mock对象的行为。
例如,以下代码将指定当调用myList的get(0)方法时返回'first item': when(myList.get(0)).thenReturn('first item');3.验证mock对象的调用使用verify()方法可以验证mock对象的调用。
例如,以下代码将验证myList的add()方法是否被调用过:verify(myList).add('some item');4.处理void方法对于返回类型为void的方法,可以使用doNothing()、doThrow()、doAnswer()等方法。
例如,以下代码将指定当调用myList的clear()方法时不执行任何操作:doNothing().when(myList).clear();5.重置mock对象使用reset()方法可以重置mock对象。
例如,以下代码将重置myList:reset(myList);Mockito是一个功能强大的测试框架,可以帮助开发人员编写更健壮的单元测试。
通过使用上述用法,可以更好地利用Mockito来模拟依赖项,验证调用和处理void方法。
Mockito简单教程官网:API文档:/mockito/docs/current/org/mockito/Mockito.html 项目源码:https:///mockito/mockitoMockito引入首先添加maven依赖<dependency><groupId>org.mockito</groupId><artifactId>mockito-all</artifactId><version>1.9.5</version><scope>test</scope></dependency>当然mockito需要junit配合使用<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency>然后为了使代码更简洁,最好在测试类中导入静态资源import static org.mockito.Mockito.*;import static org.junit.Assert.*;下面我们开始使用mockito来做测试。
1、验证行为@Testpublic void verify_behaviour(){//模拟创建一个List对象List mock = mock(List.class);//使用mock的对象mock.add(1);mock.clear();//验证add(1)和clear()行为是否发生verify(mock).add(1);verify(mock).clear();}2、模拟我们所期望的结果@Testpublic void when_thenReturn(){//mock一个Iterator类Iterator iterator = mock(Iterator.class);//预设当iterator调用next()时第一次返回hello,第n次都返回worldwhen(iterator.next()).thenReturn("hello").thenReturn("worl d");//使用mock的对象String result = iterator.next() + " " + iterator.n ext() + " " + iterator.next();//验证结果assertEquals("hello world world",result);}@Test(expected = IOException.class)public void when_thenThrow() throws IOException {OutputStream outputStream = mock(OutputStream.class);OutputStreamWriter writer = new OutputStreamWriter(out putStream);//预设当流关闭时抛出异常doThrow(new IOException()).when(outputStream).close();outputStream.close();}3、参数匹配@Testpublic void with_arguments(){Comparable comparable = mock(Comparable.class);//预设根据不同的参数返回不同的结果when(pareTo("Test")).thenReturn(1);when(pareTo("Omg")).thenReturn(2);assertEquals(1, pareTo("Test"));assertEquals(2, pareTo("Omg"));//对于没有预设的情况会返回默认值assertEquals(0, pareTo("Not stub"));}除了匹配制定参数外,还可以匹配自己想要的任意参数@Testpublic void with_unspecified_arguments(){List list = mock(List.class);//匹配任意参数when(list.get(anyInt())).thenReturn(1);when(list.contains(argThat(new IsValid()))).thenReturn(tr ue);assertEquals(1, list.get(1));assertEquals(1, list.get(999));assertTrue(list.contains(1));assertTrue(!list.contains(3));}private class IsValid extends ArgumentMatcher<List>{@Overridepublic boolean matches(Object o) {return o == 1 || o == 2;}}需要注意的是如果你使用了参数匹配,那么所有的参数都必须通过matchers来匹配@Testpublic void all_arguments_provided_by_matchers(){Comparator comparator = mock(Comparator.class);pare("nihao","hello");//如果你使用了参数匹配,那么所有的参数都必须通过matchers 来匹配verify(comparator).compare(anyString(),eq("hello"));//下面的为无效的参数匹配使用//verify(comparator).compare(anyString(),"hello");}4、验证确切的调用次数@Testpublic void verifying_number_of_invocations(){List list = mock(List.class);list.add(1);list.add(2);list.add(2);list.add(3);list.add(3);list.add(3);//验证是否被调用一次,等效于下面的times(1)verify(list).add(1);verify(list,times(1)).add(1);//验证是否被调用2次verify(list,times(2)).add(2);//验证是否被调用3次verify(list,times(3)).add(3);//验证是否从未被调用过verify(list,never()).add(4);//验证至少调用一次verify(list,atLeastOnce()).add(1);//验证至少调用2次verify(list,atLeast(2)).add(2);//验证至多调用3次verify(list,atMost(3)).add(3);}5、模拟方法体抛出异常@Test(expected = RuntimeException.class)public void doThrow_when(){List list = mock(List.class);doThrow(new RuntimeException()).when(list).add(1);list.add(1);}6、验证执行顺序@Testpublic void verification_in_order(){List list = mock(List.class);List list2 = mock(List.class);list.add(1);list2.add("hello");list.add(2);list2.add("world");//将需要排序的mock对象放入InOrderInOrder inOrder = inOrder(list,list2);//下面的代码不能颠倒顺序,验证执行顺序inOrder.verify(list).add(1);inOrder.verify(list2).add("hello");inOrder.verify(list).add(2);inOrder.verify(list2).add("world");}7、确保模拟对象上无互动发生@Testpublic void verify_interaction(){List list = mock(List.class);List list2 = mock(List.class);List list3 = mock(List.class);list.add(1);verify(list).add(1);verify(list,never()).add(2);//验证零互动行为verifyZeroInteractions(list2,list3);}8、找出冗余的互动(即未被验证到的)@Test(expected = NoInteractionsWanted.class)public void find_redundant_interaction(){List list = mock(List.class);list.add(1);list.add(2);verify(list,times(2)).add(anyInt());//检查是否有未被验证的互动行为,因为add(1)和add(2)都会被上面的anyInt()验证到,所以下面的代码会通过verifyNoMoreInteractions(list);List list2 = mock(List.class);list2.add(1);list2.add(2);verify(list2).add(1);//检查是否有未被验证的互动行为,因为add(2)没有被验证,所以下面的代码会失败抛出异常verifyNoMoreInteractions(list2);}9、使用注解来快速模拟在上面的测试中我们在每个测试方法里都mock了一个List对象,为了避免重复的mock,是测试类更具有可读性,我们可以使用下面的注解方式来快速模拟对象:@Mockprivate List mockList;OK,我们再用注解的mock对象试试@Testpublic void shorthand(){mockList.add(1);verify(mockList).add(1);}运行这个测试类你会发现报错了,mock的对象为NULL,为此我们必须在基类中添加初始化mock的代码public class MockitoExample2 {@Mockprivate List mockList;public MockitoExample2(){MockitoAnnotations.initMocks(this);}@Testpublic void shorthand(){mockList.add(1);verify(mockList).add(1);}}或者使用built-in runner:MockitoJUnitRunner@RunWith(MockitoJUnitRunner.class)public class MockitoExample2 {@Mockprivate List mockList;@Testpublic void shorthand(){mockList.add(1);verify(mockList).add(1);}}更多的注解还有@Captor,@Spy,@InjectMocks10、连续调用@Test(expected = RuntimeException.class)public void consecutive_calls(){//模拟连续调用返回期望值,如果分开,则只有最后一个有效when(mockList.get(0)).thenReturn(0);when(mockList.get(0)).thenReturn(1);when(mockList.get(0)).thenReturn(2);when(mockList.get(1)).thenReturn(0).thenReturn(1).thenThro w(new RuntimeException());assertEquals(2,mockList.get(0));assertEquals(2,mockList.get(0));assertEquals(0,mockList.get(1));assertEquals(1,mockList.get(1));//第三次或更多调用都会抛出异常mockList.get(1);}11、使用回调生成期望值@Testpublic void answer_with_callback(){//使用Answer来生成我们我们期望的返回when(mockList.get(anyInt())).thenAnswer(new Answer<Object >() {@Overridepublic Object answer(InvocationOnMock invocatio n) throws Throwable {Object[] args = invocation.getArguments ();return "hello world:"+args[0];}});assertEquals("hello world:0",mockList.get(0));assertEquals("hello world:999",mockList.get(999));}12、监控真实对象使用spy来监控真实的对象,需要注意的是此时我们需要谨慎的使用when-then语句,而改用do-when语句@Test(expected = IndexOutOfBoundsException.class)public void spy_on_real_objects(){List list = new LinkedList();List spy = spy(list);//下面预设的spy.get(0)会报错,因为会调用真实对象的get(0),所以会抛出越界异常//when(spy.get(0)).thenReturn(3);//使用doReturn-when可以避免when-thenReturn调用真实对象apidoReturn(999).when(spy).get(999);//预设size()期望值when(spy.size()).thenReturn(100);//调用真实对象的apispy.add(1);spy.add(2);assertEquals(100,spy.size());assertEquals(1,spy.get(0));assertEquals(2,spy.get(1));verify(spy).add(1);verify(spy).add(2);assertEquals(999,spy.get(999));spy.get(2);}13、修改对未预设的调用返回默认期望值@Testpublic void unstubbed_invocations(){//mock对象使用Answer来对未预设的调用返回默认期望值List mock = mock(List.class,new Answer() {@Overridepublic Object answer(InvocationOnMock invocatio n) throws Throwable {return 999;}});//下面的get(1)没有预设,通常情况下会返回NULL,但是使用了Answer改变了默认期望值assertEquals(999, mock.get(1));//下面的size()没有预设,通常情况下会返回0,但是使用了Answer改变了默认期望值assertEquals(999,mock.size());}14、捕获参数来进一步断言@Testpublic void capturing_args(){PersonDao personDao = mock(PersonDao.class);PersonService personService = new PersonService(person Dao);ArgumentCaptor<Person> argument = ArgumentCaptor.forCla ss(Person.class);personService.update(1,"jack");verify(personDao).update(argument.capture());assertEquals(1,argument.getValue().getId());assertEquals("jack",argument.getValue().getName());}class Person{private int id;private String name;Person(int id, String name) {this.id = id; = name;}public int getId() {return id;}public String getName() {return name;}}interface PersonDao{public void update(Person person); }class PersonService{private PersonDao personDao;PersonService(PersonDao personDao) {this.personDao = personDao;}public void update(int id,String name){personDao.update(new Person(id,name));}}15、真实的部分mock@Testpublic void real_partial_mock(){//通过spy来调用真实的apiList list = spy(new ArrayList());assertEquals(0,list.size());A a = mock(A.class);//通过thenCallRealMethod来调用真实的apiwhen(a.doSomething(anyInt())).thenCallRealMethod();assertEquals(999,a.doSomething(999));}class A{public int doSomething(int i){return i;}}16、重置mock@Testpublic void reset_mock(){List list = mock(List.class);when(list.size()).thenReturn(10);list.add(1);assertEquals(10,list.size());//重置mock,清除所有的互动和预设reset(list);assertEquals(0,list.size());}。