一、Mock静态块,静态变量,普通方法
1.准备工作
jar包版本最好保持一致
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
</dependency>
<dependency>
<groupId>org.jmockit</groupId>
<artifactId>jmockit</artifactId>
<version>1.16</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
开始用的jmockit-1.41.jar,就执行测试案例的时候失败了
2.mock静态块和静态变量
需要调用的类:
public class SomeMethods {
public static String a = "我是静态变量";
static{
System.out.println("执行静态块...");
}
public static String sayHello(String name){
System.out.println("执行静态方法...");
return "Hello! " + name;
}
public String sayHi(String name){
System.out.println("执行普通方法...");
return "Hi! " + name;
}
}
需要测试的类:
public class MockDemo {
public void method1(){
SomeMethods someMethods = new SomeMethods();
System.out.println("静态变量a的值:" + SomeMethods.a);
System.out.println("method1执行结束...");
}
}
直接执行method1,结果:
使用MockUp + @Mock 可以mock掉目标类的静态块,不执行静态块,反而在类初始化的时候执行$clinit()方法,而且,也可以给静态变量赋值。
测试类代码:
public class MockDemoTest {
@Before
public void init(){
new MockUp<SomeMethods>(SomeMethods.class){
/**
* clinit是jvm用来初始化静态变量和静态块的方法
*/
@Mock
void $clinit() {
System.out.println("MockUp代替静态执行...");
SomeMethods.a = "我是Mock之后的静态变量";
}
};
}
/**
* method1方法会执行SomeMethods的静态块,也会加载静态变量
*/
@Test
public void testMethod1(){
MockDemo mockDemo = new MockDemo();
mockDemo.method1();
Assert.assertEquals("","");
}
}
执行结果:
3.mock普通方法
需要调用的类:
public class SomeMethods {
public static String a = "我是静态变量";
static{
System.out.println("执行静态块...");
}
public static String sayHello(String name){
System.out.println("执行静态方法...");
return "Hello! " + name;
}
public String sayHi(String name){
System.out.println("执行普通方法...");
return "Hi! " + name;
}
}
需要测试的类:
public class MockDemo {
public void method1(){
SomeMethods someMethods = new SomeMethods();
System.out.println("调用普通方法返回的值:" + someMethods.sayHi("zhj"));
System.out.println("静态变量a的值:" + SomeMethods.a);
System.out.println("method1执行结束...");
}
}
调用method1,结果:
测试代码:
public class MockDemoTest {
@Before
public void init(){
new MockUp<SomeMethods>(SomeMethods.class){
/**
* clinit是jvm用来初始化静态变量和静态块的方法
*/
// @Mock
// void $clinit() {
// System.out.println("MockUp代替静态执行...");
// SomeMethods.a = "我是Mock之后的静态变量";
// }
@Mock
public String sayHi(String name){
System.out.println("执行Mock的普通方法...");
return "Mock! " + name;
}
};
}
/**
* method1方法会执行SomeMethods的静态块,也会加载静态变量
*/
@Test
public void testMethod1(){
MockDemo mockDemo = new MockDemo();
mockDemo.method1();
Assert.assertEquals("","");
}
}
执行测试代码结果:
二、Mock静态方法
1.准备工作
依赖jar包:
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.5</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.5</version>
<scope>test</scope>
</dependency>
2.mock静态方法
调用静态方法的代码:
public void method2(){
System.out.println("调用静态方法返回的值:" + SomeMethods.sayHello("zhj"));
System.out.println("method2执行结束...");
}
静态方法:
public static String sayHello(String name){
System.out.println("执行静态方法...");
return "Hello! " + name;
}
执行结果:
测试类代码:
@RunWith(PowerMockRunner.class)
@PrepareForTest({SomeMethods.class})
public class MockDemoTest2 {
/**
* method2方法会调用SomeMethods的静态方法
*/
@Test
public void testMethod2(){
PowerMockito.mockStatic(SomeMethods.class);
PowerMockito.when(SomeMethods.sayHello(Mockito.anyString())).thenReturn("我是Mock后静态方法的返回值");
MockDemo mockDemo = new MockDemo();
mockDemo.method2();
Assert.assertEquals("","");
}
}
执行测试代码,结果:
版权声明:本文为m0_37840862原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。