当前位置: 首页 > 知识库问答 >
问题:

为什么会出现错误“method execute in android.os.AsyncTask not mocked”

阎涵容
2023-03-14

我正在编写一个Android应用程序,它需要监听UDP广播消息。

我试图在侦听器类中模拟AsyncTask,以便对其进行单元测试。

问题是我总是得到错误java.lang.RuntimeException:Method execute in android.os.AsyncTask not mocked。

public class DiscoveryListener
{
    WorkGroupEventHandler workGroupEventHandler;

    private AsyncTask<Void, Void, Void> asyncTask;
    private boolean listener_active = false;

    public boolean GetListener_active()
    {
        return listener_active;
    }

    public DiscoveryListener(WorkGroupEventHandler eventHandler)
    {
        workGroupEventHandler = eventHandler;
    }

    public void Start()
    {
        if (listener_active == false)
        {
            listener_active = true;
            RunUdpListener();
        }
    }

    public void Stop()
    {
        listener_active = false;
        asyncTask.cancel(true);
    }

    public void RunUdpListener()
    {
        asyncTask = new AsyncTask<Void, Void, Void>()
        {

        @Override
        protected Void doInBackground(Void... params)
        {
            byte[] msg = new byte[4096];
            DatagramPacket datagramPacket = new DatagramPacket(msg, msg.length);
            MulticastSocket multicastReceiveSocket = null;

            try
            {
                multicastReceiveSocket = new MulticastSocket( 60000 );

                while (listener_active)
                {
                    if (isCancelled() == false)
                    {
                        multicastReceiveSocket.receive(datagramPacket);
                        ProcessIncommingMessage(datagramPacket.getAddress(), msg);
                    }
                }
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
            finally
            {
                if (multicastReceiveSocket != null)
                {
                    multicastReceiveSocket.close();
                }
            }

            return null;
            }
        };

        asyncTask.execute();
    }
}


@RunWith(PowerMockRunner.class)
@PrepareForTest({android.util.Log.class, android.os.AsyncTask.class})
public class DiscoveryListenerUnitTest
{
    private WorkGroupEventHandler eventHandler = new WorkGroupEventHandler()
    {
        @Override
        public void onWorkGroupEventHandle(String IpAddress, String Workgroup, String SerialNumber)
        {
        }
    };

    private DiscoveryListener discoveryListener = new DiscoveryListener(eventHandler);
    private AsyncTask asyncTask;

    @Test
    public void discoveryListener_doesStart() throws Exception
    {
        PowerMockito.mockStatic(android.util.Log.class);

        PowerMockito.whenNew(AsyncTask.class).withNoArguments().thenReturn(asyncTask);
        asyncTask = PowerMockito.mock(AsyncTask.class);
        when(asyncTask.execute()).thenReturn(null);

        discoveryListener.Start();
        assertEquals(true, discoveryListener.GetListener_active());
    }
}

共有1个答案

冉绯辞
2023-03-14

AsynctAsk.execute是最终的,而Mockito不能模拟最终的类或方法。

    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的测试友好的替代实现(“shadows”)替换类,其中包括一个用于AsyncTask的实现。

 类似资料:
  • 错误:第 1 行的解析错误:函数搜索(sour ^ 期望“字符串”、“数字”、“空”、“真”、“假”、“{”、“[”,得到“未定义” 代码:

  • 我实现了以下REST调用: 也是一个提供和使用application/x-protobuf的提供者类: 我的pom。xml看起来像: 我的小部件。原型: 选项java_package=“example”;选项java\u outer\u classname=“WidgetsProtoc”; 对于http://localhost:8080/RESTfulExample/widgets我得到以下错误消

  • 问题内容: 我已经阅读了 为什么在尝试在数据库中加载Blob时会出现java.lang.AbstractMethodError?,下载了我能找到的所有11g jdbc驱动程序,并将它们作为库和/或jar文件添加到了我的NetBeans应用程序中。我仍然不断收到相同的AbstractMethodError,这让我很生气!任何指导将不胜感激! 错误信息: 问题答案: 问题的原因是软件不兼容(jar文件

  • 当我试图从netbean部署我的web应用程序时,我得到以下错误: 那是什么?为什么我会犯这个错误? 以下是来自的代码片段: 以下是netbeans服务器设置中的快照:

  • 问题内容: 我正在尝试使用DB2运行一个简单的SQL语句,并且遇到了一些问题。我想在txt / db2文件中有一个脚本,并让引擎处理所有命令 这是脚本: 当我运行db2 -f / pathtofile时,我得到: 我究竟做错了什么?我的脚本有问题吗?另外,为什么没有“;”也能正常工作 我的陈述结尾处的终止符? 谢谢, 问题答案: 可能会有帮助, http://www.uc.edu/R/r25/do

  • 尽管花了几个小时的时间,我还是弄不明白为什么会出现404错误。 我有一个非常简单的spring MVC应用程序,但我真的看不出有什么错误。请帮帮我,我疯了 结构: SpringMVCDemo src公司 视图 main-menu.jsp 我的控制器:HomeController。Java语言 我的视图:主菜单。jsp 网状物xml spring mvc演示servlet。xml

  • 为什么会引发主线程上的网络异常?its在异步任务上 } 编辑: 完整代码: logcat:

  • 我收到这样的类型错误:- 甚至我正在使用jdk版本:-java版本"1.7.0_55"OpenJDK运行时环境(IcedTea 2.4.7)(7u55-2.4.7-1ubuntu1)OpenJDK 64位服务器VM(构建24.51-b03,混合模式) 请有人帮助我,我应该在我的项目中使用这样的组件。