使用PowerMock的EasyMock私有方法模拟
时间:2020-02-23 14:41:18 来源:igfitidea点击:
有时我们想测试使用私有方法的方法。
我们可以使用EasyMock创建模拟对象,但EasyMock不允许我们模拟私有方法。
因此,我们可以使用PowerMock EasyMock API扩展来模拟类私有方法。
使用PowerMock的EasyMock私有方法模拟
为了消除私有方法的行为,我们必须使用PowerMock.createPartialMock()来获取模拟对象。
这是必需的,这样我们才不会在调用这些私有方法的地方嘲笑这些方法。
在那之后,使用PowerMock.expectPrivate()方法来存根私有方法的行为。
在编写使用存根方法的测试代码之前,请确保调用PowerMock.replay()
。
对于存根方法调用验证,请使用PowerMock.verify()方法。
EasyMock私有方法– JUnit 4
PowerMock目前不支持JUnit 5,因此我将使用JUnit 4编写测试用例。
假设我们有一个定义为的类:
class Foo { private boolean isInit() { return false; } private String reverse(String s) { return null; } public boolean checkStatus() { return isInit(); } public String doReverse(String s) { return reverse(s); } }
注意,公共方法在内部调用类的私有方法。
这是我们其中测试私有方法行为的测试类。
package com.theitroad.easymock.powermock.privatemethod; 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.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.powermock.api.easymock.PowerMock.*; @RunWith(PowerMockRunner.class) @PrepareForTest(Foo.class) public class JUnit4PowerMockEasyMockPrivateExample { @Test public void test_private_method() throws Exception { Foo mock = createPartialMock(Foo.class, "isInit", "reverse"); expectPrivate(mock, "isInit").andReturn(true); expectPrivate(mock, "reverse", "cat").andReturn("tac"); expectPrivate(mock, "reverse", "123").andReturn("321"); replay(mock); assertTrue(mock.checkStatus()); assertEquals("tac", mock.doReverse("cat")); assertEquals("321", mock.doReverse("123")); verify(mock); } }
请注意,我们仅为私有方法创建部分模拟,未模拟公共方法。
因此,当我们调用这些公共方法时,将调用真正的方法,该方法将在内部调用私有方法,并且将使用我们的存根方法实现。
EasyMock专用方法– TestNG
这是用TestNG测试框架编写的模拟私有方法的示例。
package com.theitroad.easymock.powermock.privatemethod; 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.testng.Assert.assertTrue; @PrepareForTest(Foo.class) public class TestNGPowerMockEasyMockPrivateExample extends PowerMockTestCase{ @Test public void test_private_method() throws Exception { Foo mock = createPartialMock(Foo.class, "isInit", "reverse"); expectPrivate(mock, "isInit").andReturn(true); expectPrivate(mock, "reverse", "cat").andReturn("tac"); expectPrivate(mock, "reverse", "123").andReturn("321"); replay(mock); assertTrue(mock.checkStatus()); assertEquals("tac", mock.doReverse("cat")); assertEquals("321", mock.doReverse("123")); verify(mock); } }
注意,TestNG类扩展了PowerMockTestCase类,因此PowerMock API用于运行测试用例。