次の簡単なコードがあります。クラス(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());
}
}
クラスの最上部にも@RunWith(PowerMockRunner.class)
を追加してください。
:: edit :: 2年後...
PowerMockitoを使用しないでください。使用する必要はありません。
必要な場合は、おそらくSOLIDの原則を破っていて、設計が間違っています。
代わりにデザインを修正してください。
私は同じエラーがありましたが、これを追加して解決しました
@Rule
public PowerMockRule rule = new PowerMockRule();
テストクラス内。
最後の答えと同様に、私の問題は、Junit Testの代わりにTestNGからTestアノテーションを混合することでもありました。
import org.junit.Test; // works
import org.testng.annotations.Test // did not work
非常に厄介なエラーで、5時間以上のデバッグを費やしました:(
これを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ロードマップ
同じエラーが発生しましたが、解決しました。私の問題は、powermock-module-junit4
しかし、Junitの代わりにTestNGからのテスト注釈を含めました。
上記の回答が機能しない場合は、extends PowerMockTestCase
。このトリックはうまくいきました。
例:public class xyzTest extends PowerMockTestCase
同じエラーが発生しました。 TestNGを使用してテストを実行していました。上記の問題を解決するには、次の方法を使用する必要がありました。
@ObjectFactory
public IObjectFactory getObjectFactory() {
return new PowerMockObjectFactory();
}