web-dev-qa-db-ja.com

Mockitoは、@ PrepareForTestを追加した後でも、クラスに@PrepareForTestを追加するように要求します

次の簡単なコードがあります。クラス(TestClass)があり、「someMethod」をテストしたい。私の「someMethod」によって呼び出される外部静的メソッドがあります。その静的メソッドをPowermockして、ダミーオブジェクトを返します。最初に@PrepareForTest(ExternalClass.class)がありますが、実行するとエラーが発生します。

クラスExternalClassはテストの準備ができていません。このクラスを準備するには、'@PrepareForTest'アノテーションにクラスを追加します。このアノテーションを使用しない場合は、クラスまたはメソッドレベルでアノテーションを追加します。 =

私が@PrepareForTestを使用した方法の何が問題なのかを指摘するのを手伝ってください

@RunWith(PowerMockRunner.class)
@PrepareForTest(ExternalClass.class)
public class xyzTest {  
    @Mock
    private RestTemplate restTemplate;

    @Mock
    private TestClass testClass;

    @BeforeClass
    private void setUpBeforeClass() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testSuccessCase() {
        Boolean mockResponse = true;
        ResponseEntity<Boolean> response = new ResponseEntity<Boolean>(mockResponse, HttpStatus.OK);
        SomeClass someClass = new SomeClass("test", "1.0.0", "someUrl", "someMetaData");

        PowerMockito.mockStatic(ExternalClass.class);

        Mockito.when(restTemplate.postForEntity(any(String.class), any(String.class), eq(Boolean.class))).thenReturn(response);
        Mockito.when(ExternalClass.getSomeClass(any(String.class))).thenReturn(someClass);

        Boolean result = testClass.someMethod("test");

        Assert.isTrue(result);
        Mockito.verify(restTemplate, times(1)).postForObject(any(String.class), any(String.class), any());
    }
}
17
ViV

クラスの最上部にも@RunWith(PowerMockRunner.class)を追加してください。

:: edit :: 2年後...

PowerMockitoを使用しないでください。使用する必要はありません。

必要な場合は、おそらくSOLIDの原則を破っていて、設計が間違っています。

代わりにデザインを修正してください。

14
wild_nothing

私は同じエラーがありましたが、これを追加して解決しました

@Rule
public PowerMockRule rule = new PowerMockRule();

テストクラス内。

5
Felicia Agatha

最後の答えと同様に、私の問題は、Junit Testの代わりにTestNGからTestアノテーションを混合することでもありました。

import org.junit.Test; // works

import org.testng.annotations.Test // did not work

非常に厄介なエラーで、5時間以上のデバッグを費やしました:(

5
user2121316

これをJunit 5で動作させようとしている場合は、powermock-module-junit4 4+との互換性があると主張するベータリリースでは、ライブラリはまだ認識しません。

import org.junit.jupiter.api.Test;

そしてそれはスローされます:

org.powermock.api.mockito.ClassNotPreparedException

いつ @PrepareForTestは、静的モックを作成するクラスに適用されます。 PowerMockを使用する場合は、この時点でJunit 4に戻るか、静的メソッドのMockWrapperを作成する必要があります。

PowerMock 2.0: Githubロードマップ

3
Aaron Tobias

同じエラーが発生しましたが、解決しました。私の問題は、powermock-module-junit4しかし、Junitの代わりにTestNGからのテスト注釈を含めました。

1
Dan

上記の回答が機能しない場合は、extends PowerMockTestCase。このトリックはうまくいきました。

例:public class xyzTest extends PowerMockTestCase

0
Akshay Thorve

同じエラーが発生しました。 TestNGを使用してテストを実行していました。上記の問題を解決するには、次の方法を使用する必要がありました。

@ObjectFactory
    public IObjectFactory getObjectFactory() {
        return new PowerMockObjectFactory();
    }
0
Will_Panda