EasyMock静态方法– PowerMock,JUnit 4,TestNG

时间:2020-02-23 14:41:18  来源:igfitidea点击:

EasyMock的局限性之一是它无法模拟静态方法。
但是,我们可以使用PowerMock EasyMock扩展来模拟静态方法。

EasyMock静态方法– PowerMock

PowerMock分为多个模块以支持JUnit和TestNG测试框架。
同样,有一些模块可以扩展EasyMock和Mockito模拟框架。

我将提供一个示例,在JUnit 4和TestNG框架上使用PowerMock模拟静态方法。
因此,我们需要导入以下工件。

  • powermock模块junit4
  • powermock模块测试
  • powermock-api-easymock
  • junit,testng和easymock的原因很明显。

我没有使用JUnit 5,因为PowerMock还不支持它。
我的示例使用以下版本。

<junit4.version>4.12</junit4.version>
<testng.version>6.14.3</testng.version>
<powermock.version>2.0.0-beta.5</powermock.version>
<java.version>10</java.version>
<easymock.version>3.6</easymock.version>

JUnit PowerMock EasyMock静态方法示例

  • 第一步是使用@RunWith(PowerMockRunner.class)批注对测试类进行批注。

  • 下一步是指定准备使用PowerMock进行测试的类,例如@PrepareForTest(Utils.class)。
    这必须在类级别完成,我们可以使用其" fullyQualifiedNames"来指定多个类和包。

  • 在测试方法中,使用PowerMock.mockStatic()方法模拟类的静态方法。

  • 使用" EasyMock.expect()"方法对行为进行存根。

  • 由于我们没有模拟对象,因此请使用PowerMock.replayAll()完成设置。

  • 使用断言测试行为。

  • 使用" PowerMock.verifyAll()"来验证是否调用了所有存根方法。

假设我们有一个实用程序类:

class Utils {

	public static long generateID() {
		return System.currentTimeMillis();
	}
}

这是模拟静态方法并对其进行测试的JUnit测试。

package com.theitroad.easymock.powermock.staticmethod;

import static org.easymock.EasyMock.*;
import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.powermock.api.easymock.PowerMock.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Utils.class)
public class JUnit4PowerMockEasyMockStaticExample {

	@Test
	public void test_static_method() {
		//PowerMock.mockStatic()
		mockStatic(Utils.class);
		
		expect(Utils.generateID()).andReturn(1000L);
		
		//PowerMock.replayAll()
		replayAll();
		
		assertEquals(1000L, Utils.generateID());
		//PowerMock.verifyAll()
		verifyAll();
	}
}

TestNG PowerMock EasyMock静态方法示例

如果要使用TestNG而不是JUnit-4,请确保您的测试类扩展了PowerMockTestCase类。
同时删除@ RunWith注解。
对其他注释和断言方法进行必要的更改。

下面的类使用TestNG和PowerMock来使用EasyMock模拟静态方法。

package com.theitroad.easymock.powermock.staticmethod;

import static org.easymock.EasyMock.*;

import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.testng.PowerMockTestCase;
import org.testng.annotations.Test;

import static org.powermock.api.easymock.PowerMock.*;
import static org.testng.Assert.assertEquals;

@PrepareForTest(Utils1.class)
public class TestNGPowerMockEasyMockStaticExample extends PowerMockTestCase{

	@Test
	public void test_static_method() {
		//PowerMock.mockStatic()
		mockStatic(Utils1.class);
		
		expect(Utils1.generateID()).andReturn(1000L);
		
		//PowerMock.replayAll()
		replayAll();
		
		assertEquals(1000L, Utils1.generateID());
		//PowerMock.verifyAll()
		verifyAll();
	}
}
class Utils1 {

	public static long generateID() {
		return System.currentTimeMillis();
	}
}