Android 单元测试中遇到的一些问题汇总

  1. verifyNoMoreInteractions(listener);//验证没有更多交互
  2. @Mock private PlaybackParametersListener listener; initMocks(this);在使用 Androidunit4 时同样可以使用 Mockito;
  3. assertThat(mediaClock.syncAndGetPositionUs( false)).isEqualTo(TEST_POSITION_US);
  4. @Config(sdk = 29) // Allows using MediaFormat.getKeys() to make assertions over the expected keys.//写在类名上方
  5. 单元测试:上下文:context = InstrumentationRegistry.getTargetContext();
  6. Context applicationContext = ApplicationProvider.getApplicationContext()
  7. 反射调用私有静态方法
        //调用私有静态的
        Method method = Camera1Enumerator.class.getDeclaredMethod("getCameraInfo", Integer.class);
        method.setAccessible(true);
        android.hardware.Camera.CameraInfo cameraInfo = (android.hardware.Camera.CameraInfo) method.invoke(mCamera1Enumerator, 0);
        Assert.assertNotNull( cameraInfo);
  1. 屏蔽静态代码块加载:@SuppressStaticInitializationFor(“com.rz.paas.internal.RZRtcEngineImpl”)//阻止静态代码块运行

  2. 反射回去静态属性‘
    private Class reflectClass, reflectRecord; //用以获取私有属性
    private Field mbluetoothManager, maudioManager;
    reflectClass = mDBAudioManager.getClass();
    reflectRecord = mDBAudioRecord.getClass();
    mbluetoothManager = reflectClass.getDeclaredField(“bluetoothManager”);//私有属性
    mbluetoothManager.setAccessible(true);
    //获取其值
    mbluetoothManager.get(mDBAudioManager)
    //设置其值
    mbluetoothManager.set(mDBAudioManager,value)

  3. 描述

/**
 * 2021-08-06 Unit tests for {@link EncodedImage}.
 */
  1. 测试异常 @Test(expected = IllegalStateException.class)
  2. 抽象类的反射
    私有属性:
私有属性的变量 = 抽象类 .class.getDeclaredField("私有属性");
私有属性的变量.setAccessible(true);

方法

AbstractClass.class.getMethod("getName").invoke(子类对象); 
  1. cameraName
cameraName = "Camera 0, Facing back, Orientation 90";
cameraName_Back = "Camera 1, Facing front, Orientation 270";
  1. 单元测试测试线程
Thread thread = new Thread(){
    @Override
    public void run() {
        super.run();
        for (int i = 0; i < 5; i++) {
            System.out.println(i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
};

@Test
public void createTextureBufferWithModifiedTransformMatrix() throws Exception{
    thread.start();
    thread.join();
    System.out.println("线程执行结束");
}

thread.join(); 等待线程执行结束!

  1. 测试回调
/**
 * 回调接口
 */
interface Callback {
    void onStart();

    void onProgress(int progress);

    void onFinish();
}

/**
 * 异步方法
 */
static class AsyncDemo {
    private int len = 0;
    private Callback callback = null;

    public AsyncDemo(int len, Callback cb) {
        this.len = len;
        this.callback = cb;
    }

    public void doJob() {
        new Thread() {
            @Override
            public void run() {
                if (null != callback) {
                    callback.onStart();
                }
                try {
                    for (int i = 0; i < len; i++) {
                        if (null != callback) {
                            callback.onProgress(i);
                        }
                        sleep(1000);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    if (null != callback) {
                        callback.onFinish();
                    }
                }
            }
        }.start();
    }
}

private Object mLock = new Object(); //同步锁
private int mCount = 0; //加解锁条件

@Test
public void testBlindCallback() {
    System.out.println("testBlindCallback");
    Callback cb = new Callback() {
        public void onStart() {
            System.out.println("onStart");
        }

        public void onProgress(int progress) {
            System.out.println("onProgress: " + progress);
        }

       public void onFinish() {
           System.out.println("onFinish");
           synchronized (mLock) {
                mCount = 0;
                mLock.notifyAll();//回调执行完毕,唤醒主线程
            }
        }
    };

    System.out.println("before AsyncDemo doJob");
    AsyncDemo demo = new AsyncDemo(5, cb);
    demo.doJob();
    //作用类似于 thread.join(); 等待线程执行结束
    synchronized (mLock) {
       mCount = 1; //设置锁条件
       while (mCount > 0) {
            try {
                mLock.wait();//等待唤醒
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    System.out.println("after AsyncDemo doJob");
}

输出结果:
testBlindCallback
before AsyncDemo doJob
onStart
onProgress: 0
onProgress: 1
onProgress: 2
onProgress: 3
onProgress: 4
onFinish
after AsyncDemo doJob
  1. 初始化无参构造器
    mCamera1Session = Camera1Session.class .newInstance();
  2. Mac 运行 .sh 文件, sh ./build_libs.sh
  3. 一个Volatile;
@Test
public void test() throws Exception {
    AoFlag aoFlag = new AoFlag();
    aoFlag.start();
    for (int i = 0; i < 300; i++) {
        if (aoFlag.isFlag())
            Log.e("TAG\t\t\t", "test: ~~~ "+i);
    }
    aoFlag.join();
}
class AoFlag extends Thread {
    boolean flag = false;
    public boolean isFlag() {
        return flag;
    }
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        flag = true;
        Log.e("TAG\t\t\t", "run: " + flag);
    }
}
//输出只有:TAG			: run: true
  1. 乐观锁、悲观锁;
  2. Synchronized
  3. 理解协程、LiveData 和 Flow
  4. 没有LiveData如何实现轻松MVVM

声明

上述内容从网上搜集整理,如有侵权请私信我速删。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liusaisaiV1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值