Tag: powermock

如何使用Powermock模拟void静态方法抛出exception?

我试图使用Powermock和Mockito来模拟一个void静态方法来抛出exception,如下所示。 但我遇到了一个问题。 除非我使用相同的参数对Adder.add()进行两次调用,否则不会抛出模拟的IOException 。 顺便说@RunWith(PowerMockRunner.class) ,我已经将@RunWith(PowerMockRunner.class)和@PrepareForTest(Adder.class)到unit testing类中。 class Adder{ public static void add(int i) throws IOException{ return; } } @Test public void testAdder() throws IOException{ PowerMockito.mockStatic(Adder.class); PowerMockito.doThrow(new IOException()).when(Adder.class); Adder.add(12); try { Adder.add(11); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // assert things } 提前致谢。 🙂 答案如下。 在咨询http://code.google.com/p/powermock/issues/detail?id=278之后 ,实际上上面的Adder.add(12)是设置模拟静态方法的一部分。 这意味着在使用参数12调用Adder.add()时,将抛出IOException。 这很难理解,对吧? […]

PowerMock:模拟静态方法(+在某些特定方法中返回原始值)

我使用的是PowerMock 1.4.7和JUnit 4.8.2 我只需要模拟一些静态方法,我希望其他人(来自同一个类)只返回原始值。 当我使用mockStatic进行模拟并且不调用when().doReturn()所有静态方法都返回其默认值 – 返回Object时为null,返回boolean时返回false等等。 所以我尝试在每个静态方法上显式使用thenCallRealMethod来返回默认实现(意味着没有模拟/没有假货)但我不知道如何在每个可能的参数变量上调用它(=我想要每个可能的输入调用原始方法) 。 我只知道如何模拟具体的论证变异。

使用PowerMockito 1.6validation静态方法调用

我正在为类似于下面给出的示例的方法编写JUnit测试用例: Class SampleA{ public static void methodA(){ boolean isSuccessful = methodB(); if(isSuccessful){ SampleB.methodC(); } } public static boolean methodB(){ //some logic return true; } } Class SampleB{ public static void methodC(){ return; } } 我在我的测试类中编写了以下测试用例: @Test public void testMethodA_1(){ PowerMockito.mockStatic(SampleA.class,SampleB.class); PowerMockito.when(SampleA.methodB()).thenReturn(true); PowerMockito.doNothing().when(SampleB.class,”methodC”); PowerMockito.doCallRealMethod().when(SampleA.class,”methodA”); SampleA.methodA(); } 现在我想validation是否调用类Sample B的静态methodC()。 如何使用PowerMockito 1.6实现? 我尝试了很多东西,但似乎并没有为我做好准备。 任何帮助表示赞赏。

使用PowerMock模拟私有方法,但仍会调用底层方法

我试图嘲笑模拟一个正在进行JNDI调用的私有方法。 当从unit testing调用该方法时,它会抛出exception^。 我想嘲笑这种方法用于测试目的。 我使用了来自另一个问题答案的示例代码 ,并且在测试通过时,似乎仍然调用了基础方法。 我在doTheGamble()方法中插入了一个System.err.println() ,然后将其打印到我的控制台。 有趣的是,如果我注释掉第一个assertThat ,那么测试就会通过。 ?:( 那么,我如何模拟私有方法,以便它不被调用? import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertThat; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.powermock.api.mockito.PowerMockito.when; import static org.powermock.api.support.membermodification.MemberMatcher.method; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(CodeWithPrivateMethod.class) public class PowerMock_Test { static boolean gambleCalled = false; @Test(expected = […]

模拟java.time.format.DateTimeFormatter类

我正在尝试模拟DateTimeFormatter类。 我做了以下事情: @RunWith(PowerMockRunner.class) @PrepareForTest({DateTimeFormatter.class}) public class UnitTest { private DateTimeFormatter mockDateFormatter; private AwesomeClass awesomeClass; @Before public void setUp() { mockDateFormatter = PowerMockito.mock(DateTimeFormatter.class); awesomeClass = new AwesomeClass(mockDateFormatter); } @Test public void shouldToTestSomethingAwesome() { // Other test code PowerMockito.when(mockDateFormatter.format(any(LocalDate.class))) .thenReturn(“20150224”); // Other test code } AwesomeClass使用它来格式化LocalDateTime.now(ZoneId.of(“UTC”)); 。 然后,格式化的字符串进一步用于生成另一个字符串。 我需要确保正确生成字符串。 所以我需要从格式化程序返回一致日期或模拟LocalDateTime.now(..)静态方法 我究竟做错了什么?

使用PowerMock进行每次测试后,模拟行为都会重置

我正在使用PowerMock编写unit testing,模拟一些util类的行为。 为测试类定义一次行为(通过@BeforeClass注释)会导致: 第一次测试调用返回模拟值 第二次测试调用返回实际方法返回值 示例代码: import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest( {A.class, B.class}) public class TestMockedMethods { private static B b; @BeforeClass public static void setUp() { PowerMockito.mockStatic(A.class); PowerMockito.when(A.getVal()).thenReturn(“X”); b = PowerMockito.mock(B.class); PowerMockito.when(b.getVal()).thenReturn(“Y”); } @Test public void test1() { // PASS Assert.assertEquals(“X”, A.getVal()); Assert.assertEquals(“Y”, […]

Powermock – java.lang.IllegalStateException:无法转换类

描述: 我试图从类中测试静态方法。 我使用powerMock(1.6.2)+ mockito(1.10.19)与Junit4(4.12)和java8一起进行模拟。 问题: 获取错误:“无法转换名为com.gs.ops.domain.StaticClass的类原因:java.io.IOException:无效的常量类型:18” 解决方案: 谷歌搜索线程与powermock问题 – mockito和java-8 从powermock中排除了java协助,并添加了java协助3.19.0-GA 试过不同版本的powermock(1.5.4,1.6.2 ……) 下面是exception堆栈跟踪: java.lang.IllegalStateException: Failed to transform class with name com.StaticClass. Reason: java.io.IOException: invalid constant type: 18 at org.powermock.core.classloader.MockClassLoader.loadMockClass(MockClassLoader.java:266) at org.powermock.core.classloader.MockClassLoader.loadModifiedClass(MockClassLoader.java:180) at org.powermock.core.classloader.DeferSupportingClassLoader.loadClass(DeferSupportingClassLoader.java:68) at java.lang.ClassLoader.loadClass(ClassLoader.java:357) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:340) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:145) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.createDelegatorFromClassloader(JUnit4TestSuiteChunkerImpl.java:40) at org.powermock.tests.utils.impl.AbstractTestSuiteChunkerImpl.createTestDelegators(AbstractTestSuiteChunkerImpl.java:244) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.(JUnit4TestSuiteChunkerImpl.java:61) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.(AbstractCommonPowerMockRunner.java:32) at org.powermock.modules.junit4.PowerMockRunner.(PowerMockRunner.java:34) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native […]

是否可以在PowerMock中对私有静态方法使用部分模拟?

从PowerMock主页上的示例中,我看到以下示例,用于部分模拟Mockito的私有方法: @RunWith(PowerMockRunner.class) // We prepare PartialMockClass for test because it’s final or we need to mock private or static methods @PrepareForTest(PartialMockClass.class) public class YourTestCase { @Test public void privatePartialMockingWithPowerMock() { PartialMockClass classUnderTest = PowerMockito.spy(new PartialMockClass()); // use PowerMockito to set up your expectation PowerMockito.doReturn(value).when(classUnderTest, “methodToMock”, “parameter1”); // execute your test classUnderTest.execute(); // Use PowerMockito.verify() to […]

mockito test在运行junit test时没有给出这样的方法错误,但是当在运行配置中手动添加jar时,它运行良好

我一直面临着一个特殊的问题。 基本上,当我正常运行我的Mockito / PowerMockito测试,即’Run as Junit Test’时,它会给我以下错误: java.lang.NoSuchMethodError: org.mockito.mock.MockCreationSettings.isUsingConstructor()Z at org.mockito.internal.creation.instance.InstantiatorProvider.getInstantiator(InstantiatorProvider.java:10) at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:110) at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:58) at org.powermock.api.mockito.PowerMockito.mock(PowerMockito.java:203) at org.powermock.api.extension.listener.AnnotationEnabler.standardInject(AnnotationEnabler.java:106) at org.powermock.api.extension.listener.AnnotationEnabler.beforeTestMethod(AnnotationEnabler.java:54) at org.powermock.tests.utils.impl.PowerMockTestNotifierImpl.notifyBeforeTestMethod(PowerMockTestNotifierImpl.java:90) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.executeTest(PowerMockJUnit44RunnerDelegateImpl.java:292) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTestInSuper(PowerMockJUnit47RunnerDelegateImpl.java:127) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit47RunnerDelegateImpl$PowerMockJUnit47MethodRunner.executeTest(PowerMockJUnit47RunnerDelegateImpl.java:82) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$PowerMockJUnit44MethodRunner.runBeforesThenTestThenAfters(PowerMockJUnit44RunnerDelegateImpl.java:282) at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:86) at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:49) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.invokeTestMethod(PowerMockJUnit44RunnerDelegateImpl.java:207) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.runMethods(PowerMockJUnit44RunnerDelegateImpl.java:146) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl$1.run(PowerMockJUnit44RunnerDelegateImpl.java:120) at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:33) at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:45) at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.run(PowerMockJUnit44RunnerDelegateImpl.java:122) at org.powermock.modules.junit4.common.internal.impl.JUnit4TestSuiteChunkerImpl.run(JUnit4TestSuiteChunkerImpl.java:106) at org.powermock.modules.junit4.common.internal.impl.AbstractCommonPowerMockRunner.run(AbstractCommonPowerMockRunner.java:53) at org.powermock.modules.junit4.PowerMockRunner.run(PowerMockRunner.java:59) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) […]

嘲弄保护方法

我想模拟一个inheritance的受保护方法。 我无法直接从java代码调用此方法,因为它inheritance自另一个包中的类。 我无法找到一种方法来指定这个方法来存入when(…) package a; public class A() { protected int m() {} } package b; public class B extends aA { // this class currently does not override m method from aA public asd() {} } // test package b; class BTest { @Test public void testClass() { B instance = PowerMockito.spy(new B()); PowerMockito.when(instance, […]