gpt4 book ai didi

java - 为什么模拟不能与 AsyncTask 一起工作?

转载 作者:行者123 更新时间:2023-11-29 06:56:11 24 4
gpt4 key购买 nike

我正在使用 ApplicationTestCase 测试 Android 应用程序。我想模拟我的 AsyncTasks 之一(简化示例以显示问题):

public class Foo extends AsyncTask<Void,Void,Void> {
@Override
protected Void doInBackground(Void... unused) {
return null;
}
}

因此,为了设置我的测试,我执行了以下操作:

private Foo mockFoo;

@Override
protected void setUp() throws Exception {
super.setUp()

mockFoo = mock(Foo.class);

createApplication();
}

然后实际测试如下:

public void testAsyncTaskMock() {
mockFoo.execute();
verify(mockFoo).execute();
}

但是当 mockFoo.execute(); 运行时我得到一个异常:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.os.AsyncTask$Status.ordinal()' on a null object reference

为什么模拟 AsyncTask 的技术不起作用?

请注意,在这个简单的案例中,删除 createApplication(); 会导致问题消失,但对于我的实际测试,我确实需要创建应用程序。

最佳答案

AsyncTask.execute是最终的,Mockito can't mock final classes or methods .

  • Cannot mock final methods - their real behavior is executed without any exception. Mockito cannot warn you about mocking final methods so be vigilant.

具体来说,这是因为 Java 可以在编译时解析链接,这意味着 Mockito 无法使用其生成的子类和方法覆盖来更改行为。

您可以选择使用 Powermock ,它使用特殊的类加载器重写旧行为,或 Robolectric ,它做同样的事情,但用特定于 Android 的测试友好的替代实现(“阴影”)替换类 including one for AsyncTask .

关于java - 为什么模拟不能与 AsyncTask 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33556172/

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