相关文章推荐
要出家的钥匙扣  ·  Item 21: ...·  9 月前    · 
独立的肉夹馍  ·  Window.OnSourceInitial ...·  1 年前    · 

2.1 存根类(Stub)

存根(Stub)类是实现了一个接口或者抽象类的类,可以在测试过程中可以使用该类对象调用该类的方法进行测试.存根类的对象需要手动创建.如:

Private PingAnEnterService pingAnEnterService = new PingAnEnterServiceImpl();

2.2模拟对象 (Mock)

模拟对象(mock object)是一个接口或者类的虚拟实现.可以使用mock(T.class)方法或使用@Mock注解生成模拟对象.如:

//模拟创建一个List对象

List mock = mock(List.class);

@Mock

private List<String,Object> list;

存根和模拟对象都可以传递给其他的对象进行测试。你的一些单元测试可以测这些类的正确性等。利用存根对象或者模拟对象可以保证测试过程中不受到其他的影响

3.对应的注解

3.1 @Mock

生成一个模拟对象.与方法mock(T  t)作用一样 . 有个 name 属性 , 可以设置对象的别名 .

3.2 @InjectMocks

创建一个实例, 其余用 @Mock (或 @Spy )注解创建的 mock 将被注入到用该实例中 .

注意:必须使用 @RunWith(MockitoJUnitRunner.class) Mockito.initMocks(this) 进行mocks的初始化和注入。如下:

@RunWith(MockitoJUnitRunner.class)

public class Test{

@InjectMocks  //创建someHandler实例

private SomeHandler someHandler;

@Mock

private OneDependency oneDependency; // 此mock将被注入到someHandler

public class Test{

@InjectMocks

//创建someHandler实例. SomeHandler是类

//private SomeHandler someHandler;

//创建someHandler实例. SomeHandler是接口

private SomeHandler someHandler = new SomeHandlerImpl();

@Mock

private OneDependency oneDependency; // 此mock将被注入到someHandler

@Before

public void before(){

MockitoAnnotations.initMocks(this);

//给模拟对象属性赋值

when(oneDependency.setOpenId).thenReturn(“mlsama”);

. . .

4.Mockito的限制

以下的类型不能进行构造:

终态类(final classes)

匿名类(anonymous classes)

基本数据类型(primitive types)

5.模拟对象的配置

其实就是对使用@Mock或mock(T  t)创建的模拟对象方法设置返回值(通过set方法完成成员变量赋值).

5.1方式一

设置返回值:

when( mock.method() ).thenReturn(value)

设置返回异常 :

when( mock.method() ).thenThrow(new XXXException())

迭代风格 : 第一次调用返回 , 第二次返回

when( mock.method() ).thenReturn("Hello").thenReturn("World")

@Test

public void mock1(){

// 模拟创建一个 List 对象

List mock = mock(List.class);

// 这里也可以 : thenReturn (new RuntimeException());

when(mock.get(1)).thenReturn(1);

when(mock.get(1)).thenThrow(newRuntimeException());

System.out.println(mock.get(1));// 抛异常

需要注意的是 : when(T  t), 所以里面的方法的返回值不能是 void

5.2 方式二

设置返回值:

doReturn(value).when( mock ) .method()

设置返回异常 :

doThrow(new XXXException()).when( mock ) .method()

@Test

public void mock1(){

// 模拟创建一个 List 对象

List mock =mock(List.class);

doReturn(1), when(mock) .get(1);

doThrow(new RuntimeException()).when(mock) .get(1);

System.out.println(mock.get(1));// 抛异常

注意 : 以上方式不支持返回值为 void 的方法 .

5.3 对void方法进行方法预期设定

doNothing() 模拟不做任何返回( mock 对象 void 方法的默认返回)
doNothing().when(mock).remove();

doThrow(Throwable)
模拟返回异常
doThrow(new RuntimeException()).when(mock).remove();

6. 验证模拟对象的行为

Mockito 跟踪了所有的方法调用和参数的调用情况。 verify() 可以验证方法的行为。

verify( 模拟对象 ). 模拟对象的方法 ( 参数列表 )

查看下面的例子:

@Test

public void testMap() {

Map mock =Mockito.mock( Map.class );

Mockito.when(mock.get( "city" ) ).thenReturn( " 深圳 " );

// test code

assertEquals(" 城市测试 ", " 深圳 ", mock.get( "city" ) );

Mockito.verify(mock).get( Matchers.eq( "city" ) );

Mockito.verify(mock, Mockito.times( 2 ) );

7. Spy

@Spy 或者方法 spy() 可以包含一个真实的对象 . 每次调用,除非特出指定,否则委托给该真实对象的调用 .

@Test

public void testSpy() {

// Lets mock aLinkedList

List list = new LinkedList();

list.add("yes" );

List spy =Mockito.spy(list);

//You have to usedoReturn() for stubbing

assertEquals("yes", spy.get( 0 ) );

Mockito.doReturn("foo").when(spy).get(0);

assertEquals("foo", spy.get( 0 ) );

Method sleep = Power Mockito .method(ParamRefreshFlowControlService.class, "sleep", StateSyncDataService.class,String.class); MemberModifier.field(ParamRefreshFlowControlService.class, "sleepTime").set... 文章目录一、Mock静态块,静态变量,普通方法1.准备工作2.mock静态块和静态变量3.mock普通方法二、Mock静态方法1.准备工作2.mock静态方法 一、Mock静态块,静态变量,普通方法 1.准备工作 jar包版本最好保持一致 <dependency> <groupId>org. mockito </groupId> <artifactId> mockito -core</artifactId> <version> Mock的中文的意思就是模拟, Mockito 是一个模拟对象框架,主要还是用于单元测试中,它通过隐藏真实的实现来返回我们期望的结果,这样我们就可以排除其它可能对当前单元的执行结果产生影响的其它因素,如我们的某个功能需要调用一个远程接口,但是这个时候我们只需要关心当前功能是否能够正常工作而不需要关心远程接口是否正常工作,我们就可以通过模拟远程接口返回的正确或者错误值进行测试。 这是两篇关... mock的由来一开始,没有mock的时候,人们测试的时候只能自己mock。比如需要一个PersonDao类的对象,其中有连接数据库查询数据库当前存储人数的方法getPersonNum()。但是可能因为数据库不存在等问题,其中的操作并不能正确执行,这时候一般:public PerSonDaoMock extends PersonDao{ @Override public int get 在java写单测过程中经常使用 Mockito 来为类中的属性和方法 赋值 ,以简单高效的测试方法中逻辑的正确性。但遇到父类中存在引入变量时,初始化子类就会抛出空指针异常,导致整个单测报错,具体实例如下 public class A { @Value{"${test}"} protect String c; public void method() { System.out.println(c); public class B extends A { Spring boot中静态变量 赋值 情形1:静态变量为自动注入的对象 解决方案:设置两个变量,非静态变量使用@resource注入Bean,然后使用@PostConstruct在Spring初始化Bean成功后为静态变量 赋值 原文链接:https://blog.csdn.net/qq_38646452/article/details/124943944。mb.when(()->需要模拟的静态方法的类名.方法名(参数)).thenReturn(返回值);mb.when(需要模拟的静态方法的类名::方法名).thenReturn(返回值);.mockStatic(需要模拟的静态方法的类名)) {.mockStatic(需要模拟的静态方法的类名)) {//模拟带参数的静态方法的返回值。//方法的输入为source。 mock私有属性并 赋值 : private HttpServletRequest getRequest() { return RpcContext.getContext().getRequest(HttpServletRequest.class); private HttpServletResponse getResponse() { return RpcContext.getContext().getResponse(HttpServletRes