web-dev-qa-db-ja.com

パワーmockitoを使用したメソッド呼び出しのモック-org.powermock.api.mockito.ClassNotPreparedException

イメージローダークラスがあり、その中のいくつかの静的メソッドをテストする必要があります。 Mockitoは静的メソッドをサポートしていないため、Power Mockitoに切り替えました。しかし、私がテストしている静的メソッドにはメソッド呼び出しがあります

 Base64.encodeToString(byteArray, Base64.DEFAULT);

これをモックするには、@-PrepareForTestアノテーションで以下のようにmockStaticメソッドを使用しています。

 PowerMockito.mockStatic(Base64.class);

しかしAndroid studioは私を返していますが、以下のようにエラーを返します。

org.powermock.api.mockito.ClassNotPreparedException:クラスAndroid.util.Base64はテストの準備ができていません。このクラスを準備するには、クラスを「@PrepareForTest」アノテーションに追加します。

以下は私の完全なコードです。

テストするコード:

import Android.graphics.Bitmap;
import Android.graphics.BitmapFactory;
import Android.util.Base64;
import Android.widget.ImageView;

  public static String convertBitmapToBase64(Bitmap imageBitmap, boolean withCompression) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    imageBitmap.compress(Bitmap.CompressFormat.PNG, 120, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream.toByteArray();
    return Base64.encodeToString(byteArray, Base64.DEFAULT);
}

テストクラスコード

import Android.graphics.Bitmap;
import Android.util.Base64;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.testng.annotations.Test;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Base64.class})
public class ImageLoaderTest  {
@Test
   public void testConvertBitmap(){
    byte[] array = new byte[20];
    PowerMockito.mockStatic(Base64.class);
    PowerMockito.when(Base64.encodeToString(array, Base64.DEFAULT)).thenReturn("asdfghjkl");
    Bitmap mockedBitmap= PowerMockito.mock(Bitmap.class);
    String output = ImageLoaderUtils.convertBitmapToBase64(mockedBitmap);
    assert (!output.isEmpty());
}

}

Gradle依存関係

testCompile 'junit:junit:4.12'
testCompile 'org.powermock:powermock:1.6.5'
testCompile 'org.powermock:powermock-module-junit4:1.6.5'
testCompile 'org.powermock:powermock-api-mockito:1.6.5'
19
Ajith Memana

短い答えはできません。ここから [〜#〜] faq [〜#〜]

Mockitoの制限は何ですか

  • 最終クラスをモックできません
  • 静的メソッドをモックできません
  • Finalメソッドをモックできません-それらの実際の動作は例外なく実行されます。 Mockitoは最終メソッドのモックについて警告することはできませんので注意してください。

この制限に関する詳細情報:

静的メソッドをモックできますか?

いいえ。Mockitoは、理解と変更が難しい静的な手続き型コードよりもオブジェクト指向と依存性注入を好みます。恐ろしいレガシーコードを扱う場合は、JMockitまたはPowermockを使用して静的メソッドをモックできます。

PowerMockを使用する場合は、次のようにしてください。

@RunWith(PowerMockRunner.class)
@PrepareForTest( { Base64.class })
public class YourTestCase {
    @Test
    public void testStatic() {
        mockStatic(Base64.class);
        when(Base64.encodeToString(argument)).thenReturn("expected result");
    }
}

編集: Mockito 2では、最終クラスと最終メソッドをモックできるようになりました 。これはオプトインオプションです。ファイルを作成する必要がありますsrc/test/resources/mockito-extensions/org.mockito.plugins.MockMaker次のコンテンツ:

mock-maker-inline
11
JEY

_@PrepareForTest_に加えて、_extends PowerMockTestCase_も使用します

例:@PrepareForTest({Base64.class}) public class ImageLoaderTest extends PowerMockTestCase

0
Akshay Thorve