EasyMock最终方法– PowerMock,JUnit 4,TestNG

时间:2020-02-23 14:41:17  来源: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(Data.class)"。
    这必须在类级别完成,我们可以使用其" fullyQualifiedNames"来指定多个类和包。

  • 在测试方法中,使用PowerMock.createMock()方法模拟最终类。

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

  • 使用PowerMock.replay()完成模拟对象及其行为设置。

  • 使用JUnit 4断言测试行为。

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

假设我们的期末程序为:

final class Data {
	final String reverse(String s) {
		return new StringBuffer(s).reverse().toString();
	}
}

这是模拟最终类及其最终方法并对其进行测试的JUnit测试。

package com.theitroad.easymock.powermock.finalmethod;

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.*;
import static org.easymock.EasyMock.expect;
import static org.junit.Assert.assertEquals;
import static org.easymock.EasyMock.anyString;

@RunWith(PowerMockRunner.class)
@PrepareForTest(Data.class)
public class JUnit4PowerMockEasyMockFinalExample {

	@Test
	public void test_final_method_class() {
		//PowerMock.createMock()
		Data mock = createMock(Data.class);
		
		expect(mock.reverse("CAT")).andReturn("TAC");
		expect(mock.reverse(anyString())).andReturn("INVALID");
		
		//PowerMock.replay()
		replay(mock);
		
		assertEquals("TAC", mock.reverse("CAT"));
		assertEquals("INVALID", mock.reverse("Java"));
		
		//PowerMock.verify()
		verify(mock);
	}

}

TestNG PowerMock EasyMock最终方法示例

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

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

package com.theitroad.easymock.powermock.finalmethod;

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;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.anyString;

@PrepareForTest(Data1.class)
public class TestNGPowerMockEasyMockFinalExample extends PowerMockTestCase{

	@Test
	public void test_final_method_class() {
		//PowerMock.createMock()
		Data1 mock = createMock(Data1.class);
		
		expect(mock.reverse("CAT")).andReturn("TAC");
		expect(mock.reverse(anyString())).andReturn("INVALID");
		
		//PowerMock.replay()
		replay(mock);
		
		assertEquals("TAC", mock.reverse("CAT"));
		assertEquals("INVALID", mock.reverse("Java"));
		
		//PowerMock.verify()
		verify(mock);
	}

}

final class Data1 {
	final String reverse(String s) {
		return new StringBuffer(s).reverse().toString();
	}
}