【发布时间】:2017-06-07 10:46:18
【问题描述】:
我正在编写一个需要监听 UDP 广播消息的 Android 应用。
我正在尝试在侦听器类中模拟 AsyncTask,以便对其进行单元测试。
问题是我总是得到错误 java.lang.RuntimeException:在 android.os.AsyncTask 中执行的方法未模拟。
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());
}
}
【问题讨论】:
标签: java android unit-testing mockito powermock