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 に答える
0

この回答を見てください:PowerMockとMockitoでLoggerとLoggerFactoryをモックする

また、Mockito.when静的呼び出しをスタブ化したい場合は使用しないでくださいPowerMockito.when

静的はテスト容易性の悪夢です。静的を使用しないようにするため、または本番コードをテストできるように PowerMock トリックを使用する必要がないようにするために、可能な限りそれを回避し、設計を作り直します。

于 2012-09-14T08:19:55.620 に答える