반응형
안드로이드 Broadcast Receiver 테스트하기
Broadcast Receiver를 테스트하는 방법에는 아래의 두 방법이 있습니다.
- ADB로 직접 Bradcast Receiver에 신호 주기
- Instrumented Unit Test를 사용해서 애뮬레이터로 테스트해보기
둘 다 장단점이 있으며 어떻게 사용할 수 있는지 알아보겠습니다.
ADB로 안드로이드 Broadcast Receiver 테스트하기
먼저 ADB로 테스트하기 위해선 다음과 같이 테스트 환경을 만들어야 합니다.
- Android 디바이스를 컴퓨터에 연결합니다.
- ADB를 사용하여 디바이스와 연결되어 있는지 확인합니다.
- adb devices 명령어를 입력하고 연결된 디바이스가 표시되는지 확인합니다.
- 브로드캐스트 이벤트를 보내기 위해 ADB 셸을 엽니다.
- adb shell 명령어를 입력합니다.
- 브로드캐스트 이벤트를 발송합니다.
- am broadcast 명령어를 사용합니다. 이 명령어는 브로드캐스트 인텐트를 발생시킵니다.
- 예를 들어, am broadcast -a android.intent.action.BOOT_COMPLETED 명령어를 입력하여 부팅 완료 이벤트를 시뮬레이트할 수 있습니다.
- 이벤트 수신을 확인합니다.
- 브로드캐스트 수신을 확인하는 앱을 실행하여 이벤트가 전송되었는지 확인할 수 있습니다.
- 예를 들어, 부팅 완료 이벤트를 확인하려면, 디바이스를 다시 시작한 후 로그인하고 앱을 실행하여 확인할 수 있습니다.
androidManifest 수정
다음과 같이 androidManifest에서 <receiver>를 등록하여하고
exported를 true로 해야 외부에서 broadCast를 수신할 수 있습니다.
<receiver
android:name=".mybroadcast.MyReceiver"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
또한 리시버에 테스트를 위한 리시버 필터를 정의해줘야합니다.
다음과 같은 방법으로 정의할 수 있습니다.
<receiver
android:name=".broadcast.MyReceiver"
android:exported="true">
<intent-filter>
<action android:name="com.my.packageName" />
</intent-filter>
주의사항
android.intent.action.BOOT_COMPLETED 같은 시스템 명령어는
안드로이드 26 (Oreo) 이상에서 외부에서 호출할 수 없습니다.
그렇기 때문에 따로 커스텀한 액션이나 다음과 같이 패키지, 클래스명을 지정한 방법으로만 테스트할 수 있습니다.
adb shell am broadcast -n your.package.name/your.package.name.braodcastClassName -e ACTION_BUTTON "action1"
참고로
-n 은 패키지명/브로드캐스트 클래스 이름이며
-e 는 같이 보낼 데이터입니다. (예를 들면 여기선 ACTION_BUTTON 라는 이름에 "action1" 넣어서 보냄)
AndroidJUnit4으로 테스트하기
먼제 브로드캐스트 테스트를 하기 전에 위에서 androidManifest에 필터를 정의했는지 확인하시길 바랍니다.
androidTest 패키지 안에 파일을 만들고
다음과 같이 입력하면 쉽게 테스트할 수 있습니다.
@RunWith(AndroidJUnit4::class)
class AlarmBroadCastTest {
private val context = InstrumentationRegistry.getInstrumentation().context
private lateinit var receiver: AlarmReceiver
@Before
fun setup() {
receiver = AlarmReceiver()
val intentFilter = IntentFilter().apply {
addAction(context.packageName)
}
// 브로드캐스트를 등록한다
InstrumentationRegistry.getInstrumentation().targetContext.registerReceiver(
receiver,
intentFilter
)
}
@Test
fun test_MY_PACKAGE_REPLACED_OnReceive() {
val intent = Intent(context.packageName)
// 브로드캐스트에 신호를 보낸다.
context.sendOrderedBroadcast(intent, null)
// wait for onReceive() in Receive class
Thread.sleep(2000)
// 리시버 안에 정의해놓은 값이 true가 되었는지 확인한다.
assertTrue(receiver.broadcastCalled)
}
@After
fun tearDown() {
// 테스트가 끝났으니 브로드캐스트 등록을 해제한다.
InstrumentationRegistry.getInstrumentation().targetContext.unregisterReceiver(receiver)
}
}
참고로 Receiver 안에는 다음과 같이 정의되어 있습니다.
override fun onReceive(context: Context?, intent: Intent?) {
println("Broadcast is called")
// 최초에 broadcastCalled는 false로 정의되어있다.
// 그렇게 때문에 onReceiver가 호출되었을 때만 broadcastCalled가 true가 된다.
broadcastCalled = true
}
그렇기 때문에 broadcastCalled 변수를 확인해서 실제로 브로드캐스트가 호출되었는지 확인할 수 있습니다.
반응형
'안드로이드(kotlin)' 카테고리의 다른 글
안드로이드 MVVM을 사용하기 위한 필수 요소 AAC란 무엇인가? (0) | 2023.03.21 |
---|---|
안드로이드 MVVM 아키텍처란 무엇인가 필요성과 그 배경 (0) | 2023.03.17 |
잠금 화면 위에 Activity 열기 - 안드로이드 13 대응 (0) | 2023.02.28 |
안드로이드 WorkManager는 왜 필요하고 어디서 쓰면될까? (0) | 2023.02.18 |
안드로이드 코틀린 editText 자동 focus 막기 (0) | 2023.02.14 |
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
댓글