我试图对广播接收机进行单元测试,该接收机正在监听" 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有一个不同的问题,因为他们不会从测试体内发出意图。
答案 0 :(得分:1)
好吧,我按照@Jeff Bowman的建议看了Method of ContentValues is not mocked。可悲的是,这个问题没有提供任何代码,所以我希望这对某些人有用......
{"cool": "beans"}
所以是的,我宁可嘲笑“getStringExtra”而不是“putExtra”。但它对我有用。
答案 1 :(得分:1)
如果您像我一样,在运行单元测试时看到此错误,但您不关心测试代码的putExtra
部分,则可以使用:
android {
// ...
testOptions {
unitTests.returnDefaultValues = true
}
}
在您应用的build.gradle
文件中。