[FR] Relax encapsulation for Firebase Messaging exception and Messages payload to enable testability
@lahirumaramba 已經在處理了。
開始於 2025年4月8日。
評估
這個 Issue 還沒有評估資料。
描述
Currently, unit testing for integration with Firebase Messaging is very challenging. The encapsulation imposed by the final and visibility of the method makes it untestable. On top of this, there is no emulator for Firebase messaging which could help with testing integration with a more production-like environment.
- I want to emulate exceptions on FCM Messaging like UNREGISTERED, INVALID_ARGUMENT when calling
com.google.firebase.messaging.FirebaseMessaging#send(com.google.firebase.messaging.Message)to test my error handling implementation e.g deleting invalid token
- com.google.firebase.messaging.FirebaseMessagingException is final thus mocking with popular libraries like Mockito is more difficult. We need to enable extra feature flags in Mockito to allow for mocking the class
- It's impossible to create an instance of an exception with FCM Messaging exception as factory methods and constructors are package protected
com.google.firebase.messaging.FirebaseMessagingException#withMessagingErrorCode
- I want to unit test if a message with a given payalod was sent to FCM
Currently FCM payload represented withcom.google.firebase.messaging.Messageis not accessible to third parties via getters.
- Assuming I want to test if a proper payload was sent via
com.google.firebase.messaging.FirebaseMessaging#send(com.google.firebase.messaging.Message)to FCM I would like to mock com.google.firebase.messaging.FirebaseMessaging and validate thatcom.google.firebase.messaging.FirebaseMessaging#send(com.google.firebase.messaging.Message)method was invoked with givendataandtoken
In this case, developers used @VisibleForTesting for their purposes for testing while they totally forgot about developers who use their library and can not access the payload of the message. On top of this, there is no provided reasonable toString to make any assertions based on this.
Describe the solution you'd like
Exceptions testing
- Option 1
Relax encapsulation for com.google.firebase.messaging.FirebaseMessagingException by deleting "final" on class and makeerrorCodeprotected - Option 2
Make factory method publiccom.google.firebase.messaging.FirebaseMessagingException#withMessagingErrorCode
Messages testing
- Option 1
Make getter public forcom.google.firebase.messaging.Message#Messageto allow accessing payload of FCM message - Option 2
Provide reasonable toString to allow asserting on the toString method
Describe alternatives you've considered
- Provide emulator for FCM which allows emulating different scenarios including errors
- Provide dedicated implementations for testing purposes, open for all users
Additional context
Too aggressive encapsulation in my opinion is harmful. Developers should balance encapsulation and testability, taking into account the users of their libraries not only their own goals to protect their code with all means available in Java which are not perfect
- 主要語言
- Java
- 星號
- 620
- 分支
- 305
- 平均合併
- 4 天 9 小時
- 30 天內合併 PR
- 4
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
firebase/firebase-admin-java 的其他 Issue
-
難度 4/5 3-5 天 新手友好度 48/100
firebase/firebase-admin-java#1231 ·
-
api: core
firebase/firebase-admin-java#1198 · 3 則留言 · 已指派 1 人 ·
-
api: remoteconfig
firebase/firebase-admin-java#1196 · 1 則留言 · 已指派 2 人 ·
-
難度 3/5 1-2 天 新手友好度 45/100
firebase/firebase-admin-java#1192 · 3 則留言 ·
-
needs-triage type: feature request
難度 3/5 1-2 天 新手友好度 45/100
firebase/firebase-admin-java#1149 · 1 則留言 ·
查看 firebase/firebase-admin-java 的全部 Issue
相似的 Issue
-
certification
難度 1/5 1 小時以內 新手友好度 80/100
-
難度 2/5 1-3 小時 新手友好度 75/100
-
[BUG] ECR GetAuthorizationToken returns a proxyEndpoint for the default region, not the request's 未關閉bug ecr
難度 2/5 1-3 小時 新手友好度 75/100
-
Needs: Triage Type: Feature request
難度 2/5 1-3 小時 新手友好度 70/100
AntennaPod/AntennaPod#8794 ·
-
agentic-workflows
難度 2/5 1-3 小時 新手友好度 65/100
github/copilot-sdk#2760 ·