在测试中创建意图:"方法putExtra在android.content.Intent中没有被模拟"

时间:2016-12-15 20:25:23

标签: android android-intent junit mocking mockito

我试图对广播接收机进行单元测试,该接收机正在监听" com.android.music.metachanged"意图使用JUnit4和Mockito。

广播接收器在收到意图时启动服务。我想声明该服务已启动。我还要声明字符串额外"艺术家"收到的意图与发送的意图相同。

这就是我到目前为止......

@RunWith(PowerMockRunner.class)
public class MusicBroadcastReceiverUnitTest {
    private MusicBroadcastReceiver mReceiver;

    @Mock
    private Context mContext;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);

        mReceiver = new MusicBroadcastReceiver();
    }

    @Test
    public void testStartMusicRegistrationService() {
        Intent intent = new Intent("com.android.music.metachanged");
        intent.putExtra("artist", "SampleArtist");

        mReceiver.onReceive(mContext, intent);
        assertNull(mReceiver.getResultData());

        ArgumentCaptor<Intent> argument = ArgumentCaptor.forClass(Intent.class);
        verify(mContext, times(1)).startService(argument.capture());

        Intent receivedIntent = argument.getValue();
        assertEquals("SampleArtist", receivedIntent.getStringExtra("artist"));
    }
}

但是这会触发java.lang.RuntimeException:android.content.Intent中的方法putExtra没有被模拟。

我检查了this,但我认为OP有一个不同的问题,因为他们不会从测试体内发出意图。

2 个答案:

答案 0 :(得分:1)

好吧,我按照@Jeff Bowman的建议看了Method of ContentValues is not mocked。可悲的是,这个问题没有提供任何代码,所以我希望这对某些人有用......

{"cool": "beans"}

所以是的,我宁可嘲笑“getStringExtra”而不是“putExtra”。但它对我有用。

答案 1 :(得分:1)

如果您像我一样,在运行单元测试时看到此错误,但您不关心测试代码的putExtra部分,则可以使用:

android {
    // ...
    testOptions {
        unitTests.returnDefaultValues = true
    }
}

在您应用的build.gradle文件中。