在LLT测试案例中,如何Mock静态方法?
如何Mock无返回值的方法?
如何Mock静态无返回值的方法?
在Mock的时候,如果使用Mockito.when(method(any,any,any,any)).thenReturn()打桩的时候,如果Mock的方法中输入的参数都使用Mockito.Any()方法时,会报nullException,这是为何?
如何Mock类中的私有方法

20210813解决2021082—0806这周遇到的问题

如何Mock静态方法?

在LLT中,现在常用的有两种,Mockito和PowerMock,后者在前者的基础上能够对static方法,private方法,final方法进行mock,相当强力,使用PowerMock需要引用使用注解

@RunWith(PowerMockRunner.class)

@PrepareForTest(静态方法所在类.class)

代码模板如下:

@RunWith(PowerMockRunner.class)
@PrepareForTest(静态方法所在类.class)

public class nameTest {
    
    .....
        
    @BeforeEach
        public  void setUp(){
        PowerMockito.mockStatic(静态方法所在类.class)  //powermockito要在innitMocks之前
           MockitoAnnotations.innitMocks(this);
        ....
            
    }
    
    @Test
      public void methodName(){
          ...
              PowerMockito.when(静态方法所在类名.静态方法()).thenReturn();  
          ...
      }
}

注意这里导入的包应该是

import org.junit.Test;
import org.powermock.api.mockito.PowerMockito;

在开发的时候如果在加了PrepareForTest注解后还是报not prepared for test 那尝试检查一下导入的test包是否支持powermock

import org.junit.jupiter.api.Test;  // 这个Test包不支持powerMock

如何Mock无返回值的方法

使用Mockito.doAnswer( ),使该方法进行制定的应答处理

Mockito.doNothing( ),使其不进行操作

如何Mock静态无返回值的方法?

使用PowerMock来模拟静态方法,参照上述代码模板,然后再通过doNothing,或者doAnswer来进行处理即可

方法一: 在执行该方法是进行制定的操作
    PowerMockito.doAnswer(new Answer(){ 匿名类实现接口Answer中的answer抽象方法}).when(staticSource.class);
   staticSource.method();

方法二: 在执行该方法时不执行任何实际的操作
    PowerMockito.doNothing().when(StaticSource.class);
    staticSource.method();

方法三: 在执行该方法的时候抛出指定的异常
    PowerMockito.doThrow(Exception e).when(staticSource.class);
    staticSource.method();
在Mock的时候,如果使用Mockito.when().thenReturn()打桩的时候,当Mock的方法中输入的参数都使用Mockito.Any()方法不指定类型时,会报nullException,这是为何?

初步参考资料是因为对象引用的地址不一致导致的,当使用any进行匹配的时候:

when中的方法参数全部都需要使用匹配器any,并且需要指定类型,否则会空指针异常
如果像使用any匹配,有需要指定参数,则需要使用Mockito.eq( 参数),不能直接混用
注意当mock的方法输入参数可能为null的情况,此时需要使用any(),而不是anyString( )

如何Mock类中的私有方法

私有方法同样是使用powerMock来解决,具体的可以搜索。