public class TestStatic {
public static int methodstatic(){
return 3;
}
}
@Test
@PrepareForTest({TestStatic.class})
public class TestStaticTest extends PowerMockTestCase {
public void testMethodstatic() throws Exception {
PowerMockito.mock(TestStatic.class);
Mockito.when(TestStatic.methodstatic()).thenReturn(5);
PowerMockito.verifyStatic();
assertThat("dff",TestStatic.methodstatic()==5);
}
@ObjectFactory
public IObjectFactory getObjectFactory() {
return new org.powermock.modules.testng.PowerMockObjectFactory();
}
}
例外情况:
org.mockito.exceptions.misusing.MissingMethodInvocationException:
when() requires an argument which has to be 'a method call on a mock'.
For example:
when(mock.getArticles()).thenReturn(articles);
Also, this error might show up because:
1. you stub either of: final/private/equals()/hashCode() methods.
Those methods *cannot* be stubbed/verified.
2. inside when() you don't call method on mock but on some other object.
我正在通过 Intellij 运行它,遗留代码有很多方法......
有人有和想法,我通过官方tuto,没有办法让这个简单的测试工作
找到了此类问题的解决方案,想与您分享:
如果我在测试类中调用模拟方法:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Calendar.class)
public class TestClass {
@Test
public void testGetDefaultDeploymentTime()
PowerMockito.mockStatic(Calendar.class);
Calendar calendar = new GregorianCalendar();
calendar.set(Calendar.HOUR_OF_DAY, 8);
calendar.set(Calendar.MINUTE, 0);
when(Calendar.getInstance()).thenReturn(calendar);
Calendar.getInstance();
}
}
它工作得很好。但是当我重写测试时,它在另一个类中调用了 Calendar.getInstance((,它使用了真正的 Calendar 方法。
@Test
public void testGetDefaultDeploymentTime() throws Exception {
mockUserBehaviour();
new AnotherClass().anotherClassMethodCall(); // Calendar.getInstance is called here
}
因此,作为解决方案,我将OtherClass.class添加到@PrepareForTest,现在可以工作了。
@PrepareForTest({Calendar.class, AnotherClass.class})
似乎PowerMock需要知道模拟静态方法将被调用在哪里。
我看了一下我对遗留代码的测试,我可以看到你调用PowerMockito.mock(TestStatic.class)
而不是PowerMockito.mockStatic(TestStatic.class)
。不管你用PowerMockito.when(...)
还是Mockito.when(...)
,因为第一个只是委托给第二个。
还有一句话:我知道也许你必须测试遗留代码。也许你可以用 JUnit4 风格来做,只是为了不产生遗留测试?布莱斯提到的例子就是一个很好的例子。
看看这个答案:Mocking Logger 和 LoggerFactory with PowerMock 和 Mockito
此外,如果您想存根静态调用,则不应使用 Mockito.when
但PowerMockito.when
.
静态是可测试性的噩梦,您可以尽可能避免这种情况,并重新设计您的设计,以便不再使用静态或不必使用 PowerMock 技巧来测试您的生产代码。