Unit testing a broadcast receiver?

后端 未结 3 520
一向
一向 2021-01-30 05:26

Here\'s a BroadcastReceiver from my project, which I\'m looking to unit test. When the user makes a phone call, it grabs the phone number, and sets up an intent to start a new

3条回答
  •  日久生厌
    2021-01-30 05:54

    Since this question was asked mocking Frameworks have evolved pretty much. With mockito you can now mock not only interfaces but as well classes. So I would suggest to solve this problem by mocking a context and using ArgumentCapture:

    import static org.mockito.Mockito.*;
    
    public class OutgoingCallReceiverTest extends AndroidTestCase {
        private OutgoingCallReceiver mReceiver;
        private Context mContext;
    
        @Override
        protected void setUp() throws Exception {
            super.setUp();
            //To make mockito work
            System.setProperty("dexmaker.dexcache", 
                    mContext.getCacheDir().toString());
    
            mReceiver = new OutgoingCallReceiver();
            mContext = mock(Context.class);
        }
    
        public void testStartActivity() {
            Intent intent = new Intent(Intent.ACTION_NEW_OUTGOING_CALL);
            intent.putExtra(Intent.EXTRA_PHONE_NUMBER, "01234567890");
    
            mReceiver.onReceive(mContext, intent);
            assertNull(mReceiver.getResultData());
    
            ArgumentCaptor argument = ArgumentCaptor.forClass(Intent.class);
            verify(mContext, times(1)).startActivity(argument.capture());
    
            Intent receivedIntent = argument.getValue();         
            assertNull(receivedIntent.getAction());
            assertEquals("01234567890", receivedIntent.getStringExtra("phoneNum"));
            assertTrue((receivedIntent.getFlags() & Intent.FLAG_ACTIVITY_NEW_TASK) != 0);
        }
    }
    

提交回复
热议问题