我的情况:
我想添加一个新的测试。我需要模拟Service类中的静态方法X。不幸的是,现有的测试在某种程度上使用了这个静态方法。
当我使用PowerMock来模拟X方法时,其他测试失败了。更重要的是,我不应该触及其他测试。
是否有机会仅为一个测试模拟静态方法?(使用PowerMock)
提前致谢。
我的情况:
我想添加一个新的测试。我需要模拟Service类中的静态方法X。不幸的是,现有的测试在某种程度上使用了这个静态方法。
当我使用PowerMock来模拟X方法时,其他测试失败了。更重要的是,我不应该触及其他测试。
是否有机会仅为一个测试模拟静态方法?(使用PowerMock)
提前致谢。
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())
}
}
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);
}
}
测试类
public class IdGenerator {
public static long generateNewId()
{
return 3L;
}
}
Mockito.when(StaticClass.method(param)).thenCallRealMethod();
使用以下方法在您的测试中存根特定方法: Mockito.when(Static.methodYouAreInterested(param)).thenReturn(value);