13
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 运行它,遗留代码有很多方法......

有人有想法,我通过了官方教程,并不意味着让这个简单的测试工作

4

3 回答 3

16

我在我的案例中找到了此类问题的解决方案,想与您分享:

如果我在测试类中调用模拟方法:

@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
}

因此,作为解决方案,我将 AnotherClass.class 添加到 @PrepareForTest 并且它现在可以工作。

@PrepareForTest({Calendar.class, AnotherClass.class})

似乎 PowerMock 需要知道将在哪里调用模拟的静态方法。

于 2015-09-10T16:28:41.507 回答
4

我查看了我对遗留代码的测试,我可以看到你调用PowerMockito.mock(TestStatic.class)而不是PowerMockito.mockStatic(TestStatic.class). PowerMockito.when(...)使用or没关系Mockito.when(...),因为第一个只是委托给第二个。

还有一点:我知道您可能必须测试遗留代码。也许你可以用 JUnit4 风格来做,只是为了不产生遗留测试?Brice 提到的例子就是一个很好的例子。

于 2013-06-10T17:30:59.507 回答
0

看看这个答案:Mocking Logger and LoggerFactory with PowerMock and Mockito

Mockito.when如果你想存根静态调用,你也不应该使用,但是PowerMockito.when.

静态是可测试性的噩梦,您要尽可能避免这种情况,并重新设计您的设计,以便不再使用静态或不必使用 PowerMock 技巧来测试您的生产代码。

于 2012-09-14T08:19:55.620 回答