建成OS 2020-06-17 11:44 采纳率: 75%
浏览 434
已采纳

Android 单元测试内部类mock

报错:

java.lang.IncompatibleClassChangeError: android.media.SoundPool and android.media.SoundPool$Builder disagree on InnerClasses attribute

错误定在这一行

mSoundPoolBuilder = PowerMockito.mock(SoundPool.Builder.class);

被测目标代码

public static void playAlarmSound(Context context, int event, int loop) {
    if (abs == null) {
        abs = new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .build();
    }
    if (mSoundPool == null) {
        mSoundPool = new SoundPool.Builder()
                    .setMaxStreams(1)
                    .setAudioAttributes(abs)
                    .build();
    }

    ........
}

单元测试代码:

@RunWith(RobolectricTestRunner.class)
@Config(manifest=“../../app/src/main/AndroidManifest.xml”)
public class WarningManagerTest {
    private AudioAttributes.Builder absBuilder;
    private AudioAttributes abs;
    private SoundPool.Builder mSoundPoolBuilder;
    private SoundPool mSoundPool;

    @Test
    public void testPlayAlarmSound(){
        absBuilder = PowerMockito.mock(AudioAttributes.Builder.class);
        abs = PowerMockito.mock(AudioAttributes.class);

        mSoundPoolBuilder = PowerMockito.mock(SoundPool.Builder.class);
        mSoundPool = PowerMockito.mock(SoundPool.class);

        //AudioAttributes
        PowerMockito.whenNew(AudioAttributes.Builder.class).withAnyArguments().thenReturn(absBuilder);
        PowerMockito.when(absBuilder.setUsage(anyInt())).thenCallRealMethod();
        PowerMockito.when(absBuilder.setContentType(anyInt())).thenCallRealMethod();
        PowerMockito.when(absBuilder.setUsage(anyInt())).thenReturn(absBuilder);
        PowerMockito.when(absBuilder.setContentType(anyInt())).thenReturn(absBuilder);
        PowerMockito.when(absBuilder.build()).thenReturn(abs);

        //SoundPool
        PowerMockito.whenNew(SoundPool.Builder.class).withAnyArguments().thenReturn(mSoundPoolBuilder);
        PowerMockito.when(mSoundPoolBuilder.setMaxStreams(anyInt())).thenCallRealMethod();
        PowerMockito.when(mSoundPoolBuilder.setAudioAttributes(any(AudioAttributes.class))).thenCallRealMethod();
        PowerMockito.when(mSoundPoolBuilder.setMaxStreams(anyInt())).thenReturn(mSoundPoolBuilder);
        PowerMockito.when(mSoundPoolBuilder.setAudioAttributes(abs)).thenReturn(mSoundPoolBuilder);
        PowerMockito.when(mSoundPoolBuilder.build()).thenReturn(mSoundPool);

        WarningManager.playAlarmSound(context, 0, 0);

    }
}

请帮忙看看什么原因。

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-06-17 11:48
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改