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

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
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 Matlab打开默认名称带有/的光谱数据
  • ¥50 easyExcel模板 动态单元格合并列
  • ¥15 res.rows如何取值使用
  • ¥15 在odoo17开发环境中,怎么实现库存管理系统,或独立模块设计与AGV小车对接?开发方面应如何设计和开发?请详细解释MES或WMS在与AGV小车对接时需完成的设计和开发
  • ¥15 CSP算法实现EEG特征提取,哪一步错了?
  • ¥15 游戏盾如何溯源服务器真实ip?需要30个字。后面的字是凑数的
  • ¥15 vue3前端取消收藏的不会引用collectId
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格