5

私の状況:

新しいテストを追加したいと思います。そして、 Service クラスの静的メソッド X を 1 つモックする必要があります。残念ながら、既存のテストでは、この静的メソッドを何らかの方法で使用しています。

そして、PowerMock を使用して X メソッドをモックすると、他のテストが失敗しました。さらに、他のテストに触れるべきではありません。

1 つのテストだけで静的メソッドをモックする機会はありますか? (PowerMock を使用)。

前もって感謝します。

4

3 に答える 3

1

問題を解決する最も簡単な方法は、新しいテスト クラスを作成し、そこにテストを配置することです。

この静的クラスを、コード内のインターフェイスの背後にある通常のクラスでラップし、テストでこのインターフェイスをスタブすることもできます。

最後に試すことができるのは、次を使用して @SetUp メソッドで静的クラスの各メソッドをスタブすることです。

Mockito.when(StaticClass.method(param)).thenCallRealMethod();

Mockito.when(Static.methodYouAreInterested(param)).thenReturn(value); を使用して、テストで特定のメソッドをスタブします。

于 2013-06-21T07:52:02.650 に答える
1

もちろん可能です!問題が発生する可能性があるのは、同時に複数のスレッドをテストしようとしている場合だけです...以下にその方法の例を示します。楽しみ。

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;
      }
}
于 2013-06-26T11:27:25.183 に答える
1

PowerMocks で Mockito を使用してこれを実現しようとし@PrepareForTestている場合は、テスト クラス自体ではなく、値をモックする必要があるテスト自体に注釈を追加することで実現できます。

この例では、常に次のように返すSomeClassstatic 関数 ( ) があるとします。returnTrue()true

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())
  }
}
于 2018-10-02T16:04:29.867 に答える