gpt4 book ai didi

Android 多线程单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:44:45 31 4
gpt4 key购买 nike

我在 Android 中遇到单元测试问题。

我的对象 MyObject 有一个方法 start() 如下:

public void start() {
final Handler onStartHandler = new Handler();
new Thread() {
@Override
public void run() {
super.run();

onStartHandler.post(new Runnable() {
@Override
public void run() {
mIsRunning = true;
onStart();
}
});
}
}.start();
}

我想测试是否调用了 onStart()。所以我尝试了类似的东西:

public void testOnStartIsCalled() {
assertFalse("onStart() should not be called", mMyObject.isRunning());
mMyObject.start();
assertTrue("onStart() should be called", mMyObject.isRunning());
mMyObject.stop();
assertFalse("onStop() should be called", mMyObject.isRunning());
}

但是不行,我猜是因为它在一个Handler和一个新的Thread中。

我的测试类扩展了 AndroidTestCase。我应该怎么办 ?这种情况下的最佳做法是什么?

问候。

最佳答案

当我处理测试一些多线程代码时,我尝试让程序尽可能多地使用它的自然流程。此外,我避免使用 sleep 语句,因为您无法保证您选择的 sleep 间隔足以让您的测试对象完成其正在做的事情;您通常最终不得不选择太大的 sleep 间隔,这会迫使您的测试用例执行得更慢。

我建议您尝试将一些代码添加到您正在测试的类中,在本例中为 MyObject,它会在发生某些事情时调用监听器。看起来你已经有了 onStart()onStop() 的回调方法(如果它们是事件/回调),所以应该调用它们并且你应该使用它们控制测试流程。当您收到 onStart() 事件时,您应该调用 stop() 并等待 onStop() 事件。

更新

首先,您有冗余代码:

public void start() {
final Handler onStartHandler = new Handler();
new Thread() {
@Override
public void run() {
super.run();

onStartHandler.post(new Runnable() {
@Override
public void run() {
mIsRunning = true;
onStart();
}
});
}
}.start();
}

要么启动一个新线程来调用 onStart(),要么在 Handler 的线程队列上安排 runnable。

版本 1- 删除处理程序,只让代码在新线程中执行:

public void start() {
new Thread() {
@Override
public void run() {
super.run();
mIsRunning = true;
onStart();
}
}.start();
}

版本 2- 仅使用处理程序异步执行回调:

public void start() {
final Handler onStartHandler = new Handler();

onStartHandler.post(new Runnable() {
@Override
public void run() {
mIsRunning = true;
onStart();
}
});
}

其次:我注意到如果你没有 Looper ,那么无论您使用 Handler 发布什么都将被忽略(因此它永远不会被调用)。有关 Looper-Handler 模式的更多信息,请参阅文章:Android Guts: Intro to Loopers and Handlers . LooperHandler 应该附加到同一个线程(通常是主线程)。此外,如果您在单独的线程上创建 Handler 作为您的 Looper,那么您将遇到同样的问题:您使用 Handler 发布的任何内容 将被忽略。

这里有一些关于循环器和处理程序的好问题和文章:

Looper、Handler、MessageQueue的关系如下图: enter image description here

关于Android 多线程单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7715978/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com