【问题标题】:Creating intent in test: "Method putExtra in android.content.Intent not mocked"在测试中创建意图:“android.content.Intent 中的方法 putExtra 未模拟”
【发布时间】:2016-12-15 20:25:22
【问题描述】:

我正在尝试对使用 JUnit4 和 Mockito 侦听“com.android.music.metachanged”意图的广播接收器进行单元测试。

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

这就是我目前所拥有的......

@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: Method putExtra in android.content.Intent not mocked。

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

【问题讨论】:

标签: android android-intent junit mocking mockito


【解决方案1】:

如果你和我一样在运行单元测试时看到了这个错误,但你并不关心测试代码的putExtra 部分,你可以使用:

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

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

【讨论】:

  • 这很有趣,如果您添加一些解释,说明它是如何实现的,那就太好了。顺便说一句,它起作用了。
【解决方案2】:

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

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

    @Mock
    private Context mContext;

    @Mock
    private Intent androidIntent;

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

        mReceiver = new MusicBroadcastReceiver();
    }

    @Test
    public void testStartMusicRegistrationService() {
        try {
        PowerMockito.whenNew(Intent.class)
               .withArguments(String.class).thenReturn(androidIntent);
        } catch (Exception e) {
            e.printStackTrace();
        }
        when(androidIntent.getAction())
          .thenReturn("com.android.music.metachanged");
        when(androidIntent.getStringExtra("artist"))
          .thenReturn("SampleArtist");

        mReceiver.onReceive(mContext, intent);

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多