LLT补充时遇到的困难与解决办法
- 在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来解决,具体的可以搜索。