web-dev-qa-db-ja.com

PowerMockRunnerでJUnitテストを実行できません

私はGradleベースのJavaプロジェクトを持っていますが、PowerMockを使用してプライベートメソッドをモックしたいのです。 @RunWith(org.powermock.modules.junit4.PowerMockRunner.class)アノテーション。

エラー:

org.powermock.reflect.exceptions.FieldNotFoundException: Field 'fTestClass' was not found in class org.junit.internal.runners.MethodValidator.
at org.powermock.reflect.internal.WhiteboxImpl.getInternalState(WhiteboxImpl.Java:581)
at org.powermock.reflect.Whitebox.getInternalState(Whitebox.Java:308)
at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validate TestMethods(PowerMockJUnit4MethodValidator.Java:79)
at org.powermock.modules.junit4.internal.impl.testcaseworkaround.PowerMockJUnit4MethodValidator.validate InstanceMethods(PowerMockJUnit4MethodValidator.Java:49)
at org.junit.internal.runners.MethodValidator.validateMethodsForDefaultRunner(MethodValidator.Java:51)
at org.powermock.modules.junit4.internal.impl.PowerMockJUnit44RunnerDelegateImpl.validate(PowerMockJUnit44RunnerDelegateImpl.Java:108)
...

これは私のテストの依存関係です:

testCompile 'junit:junit:4.+',
            'org.powermock:powermock-core:1.5.6',
            'org.powermock:powermock-module-junit4:1.5.6',
            'org.powermock:powermock-api-mockito:1.5.6'

テスト自体が完全に空の場合も失敗します(初期化エラー):

@RunWith(PowerMockRunner.class)
public class SomeTest {
    @Test
    public void testSomething() {
    }
}

何が間違っているのでしょうか? PowerMockを使用する他のテストは正常に機能しています(PowerMockRunnerを使用するテストはありません)。

ご挨拶とご協力ありがとうございます!ベン

53
Ben

これは、JUnit 4.12およびPowerMock <1.6.1を使用するときに発生するバグです。この問題はPowerMock 1.6.1で解決されています。それに応じて依存関係を更新してください

testCompile 'junit:junit:4.12',
            'org.powermock:powermock-core:1.6.1',
            'org.powermock:powermock-module-junit4:1.6.1',
            'org.powermock:powermock-api-mockito:1.6.1'

PowerMockをアップグレードできない場合は、JUnit 4.11を使用できます。

testCompile 'junit:junit:4.11',
            'org.powermock:powermock-core:1.5.6',
            'org.powermock:powermock-module-junit4:1.5.6',
            'org.powermock:powermock-api-mockito:1.5.6'

問題に関する詳細を明らかにするスタックトレースの行を追加してください。

75
Stefan Birkner

PowerMockに対してログに記録されたバグがあります: https://code.google.com/p/powermock/issues/detail?id=531

JUnitは、PowerMockがリフレクション経由でアクセスしている内部フィールド名の一部を変更し、PowerMockが自分自身を適切に挿入する機能を破壊しているようです。

1
Brandon Heck

ステファンが言ったことを確認し、その上にも追加する必要があります

@PrepareForTest({<The class/es you are Mocking>, ...})

テストの準備なしでは、PowerMockRunnerはどのクラスがモックされているかを知りません。

0
SonalKhodiyar