PowerMock:模拟仅影响一个测试的静态方法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PowerMock:模拟仅影响一个测试的静态方法相关的知识,希望对你有一定的参考价值。
我的情况:
我想补充一个新的测试。我需要模拟Service类的一个静态方法X.不幸的是,现有测试以某种方式使用这种静态方法。
当我使用PowerMock模拟X方法时,其他测试失败。更重要的是,我不应该接触其他测试。
有没有机会只为一个测试模拟静态方法? (使用PowerMock)。
提前致谢。
当然,这是可能的!你可能遇到问题的唯一一次是你是否试图同时测试多个线程...我在下面举了一个如何做的例子。请享用。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;
@RunWith(PowerMockRunner.class)
@PrepareForTest(IdGenerator.class)
public class TestClass {
@Test
public void yourTest()
{
ServiceRegistrator serTestObj = new ServiceRegistrator();
PowerMock.mockStatic(IdGenerator.class);
expect(IdGenerator.generateNewId()).andReturn(42L);
PowerMock.replay(IdGenerator.class);
long actualId = IdGenerator.generateNewId();
PowerMock.verify(IdGenerator.class);
assertEquals(42L,actualId);
}
@Test
public void unaffectedTest() {
long actualId = IdGenerator.generateNewId();
PowerMock.verify(IdGenerator.class);
assertEquals(3L,actualId);
}
}
识别TestClass
public class IdGenerator {
public static long generateNewId()
{
return 3L;
}
}
解决问题的最简单方法是创建新的测试类并将测试放在那里。
您也可以使用隐藏在代码中的接口后面的普通类来包装此静态类,并在测试中存根此接口。
您可以尝试的最后一件事是使用以下方法在@SetUp方法中存储静态类的每个方法:
Mockito.when(StaticClass.method(PARAM))thenCallRealMethod();
你的测试中使用的特定方法:Mockito.when(Static.methodYouAreInterested(param))。thenReturn(value);
对于那些希望使用Mockito和PowerMocks实现这一目标的人来说,这可以通过将@PrepareForTest
注释添加到需要模拟值而不是测试类本身的测试本身来完成。
在这个例子中,让我们假装有一个SomeClass
,它有一个静态函数(returnTrue()
)总是返回true
,如下所示:
public class SomeClass {
public static boolean returnTrue() {
return true;
}
}
此示例显示了我们如何在一个测试中模拟静态调用,并允许原始功能在另一个测试中保持不变。
@RunWith(PowerMockRunner.class)
@Config(constants = BuildConfig.class)
@PowerMockIgnore({"org.mockito.*", "android.*"})
public class SomeTest {
/** Tests that the value is not mocked out or changed at all. */
@Test
public void testOriginalFunctionalityStays()
assertTrue(SomeClass.returnTrue());
}
/** Tests that mocking out the value works here, and only here. */
@PrepareForTest(SomeClass.class)
@Test
public void testMockedValueWorks() {
PowerMockito.mockStatic(SomeClass.class);
Mockito.when(SomeClass.returnTrue()).thenReturn(false);
assertFalse(SomeClass.returnTrue())
}
}
以上是关于PowerMock:模拟仅影响一个测试的静态方法的主要内容,如果未能解决你的问题,请参考以下文章
无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类
PowerMock - 无所不能的PowerMock,mock私有方法,静态方法,测试私有方法,final类