Nir*_*bag 4 android unit-testing mockito android-notifications
我有课handleFirebaseMessages。它包含函数onMessageReceived()。该函数负责接收数据和创建通知。onMessageReceived()接收RemoteMessages对象中的数据。我正在尝试为此功能编写测试。但我还没有完全明白。
处理Firebase消息
public class HandleFirebaseMessages extends FirebaseMessagingService {
@Override
public void onMessageReceived(final RemoteMessage remoteMessage) {
final Map<String, String> data = remoteMessage.getData();
//create notifications using NotificationCompat.Builder
}
}
Run Code Online (Sandbox Code Playgroud)
我已经能够编写一部分测试代码。我该如何完成?
@Test
public void testHandleFirebaseMessages() throws Exception {
Map<String,String> data=new HashMap<String,String>();
data.put("id","4422");
data.put("type", "1");
data.put("imageUrl" , "https://image.freepik.com/free-vector/android-boot-logo_634639.jpg");
data.put("smallTitle" , "DoJMA v2");
data.put("smallSubTitle", "Update now from Google Play Store");
data.put("ticker" , "New update for DoJMA");
data.put("contentInfo" , "");
data.put("link" , "https://photo2.tinhte.vn/data/avatars/l/1885/1885712.jpg?1402763583");
data.put("className" , "HomeActivity");
data.put("page" , "2");
data.put("bigTitle" , "DoJMA Android app version 2 released!");
data.put("bigSubTitle" , "Hi folks! New DoJMA update is here! Major redesigning and improvements! This app was made by the Mobile App Club.They work really hard man...and get good products");
data.put("bigSummaryText" , "Update now");
RemoteMessage message = new RemoteMessage.Builder("1")
.setMessageId("1")
.setData(data)
.build();
(new HandleFirebaseMessages()).onMessageReceived(message);
//WHat now?
}
Run Code Online (Sandbox Code Playgroud)
您可以通过包装NotificationsAPI 使其可测试来对此进行测试。首先,您需要一种将模拟依赖项传递给包装器的构造函数的方法。你可以这样写:
class NotificationBuilderProvider {
//TODO: implement Provider<NotificationCompat.Builder> if you are using JSR-330 annotations
private Context context;
NotificationBuilderProvider(Context context) {
this.context = context;
}
@Override
public NotificationCompat.Builder get() {
return new NotificationCompat.Builder(context);
}
}
Run Code Online (Sandbox Code Playgroud)
现在你可以写一个这样的包装器:
class NotificationsWrapper {
private final NotificationBuilderProvider notificationBuilderProvider;
private final NotificationManager notificationManager;
NotficiationsWrapper(NotificationBuilderProvider notificationBuilderProvider, NotificationManager notificationManager) {
this.notificationBuilderProvider = notificationBuilderProvider;
this.notificationManager = notificationManager;
}
public void postNotification(Map<String, String> data) {
Notification notification = notificationBuilderProvider.get()
.setContentTitle(data.get("Title"))
//etc
.build();
notificationManager.notify(ID, notification);
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以为您编写一个单元测试,NotificationWrapper它比测试重量级服务更容易测试:
//mocks
NotificationBuilderProvider mockNotificationBuilderProvider;
NotificationBuilder mockNotificationBuilder;
NotificationManager mockNotificationManager;
//system under test
NotificationWrapper notificationWrapper;
@Before
public void setUp() {
mockNotificationBuilderProvider = Mockito.mock(NotificationBuilderProvider.class);
mockNotificationBuilder = Mockito.mock(NotificationCompat.Builder.class, RETURNS_SELF);
mockNotifyManager = Mockito.mock(NotificationManager.class);
}
@Test
public void givenTitleInData_whenPost_thenNotificationHasContentTitle() {
//arrange
Map<String, String> data = new HashMap<>();
data.put("Title", "MyTitle");
//act
notificationsWrapper.postNotification(data);
//assert
verify(notificationBuilder).setContentTitle(eq("Title"));
}
Run Code Online (Sandbox Code Playgroud)
如果这一切看起来有点复杂,最好先为简单的类编写单元测试,直到您对单元测试和模拟的概念感到满意为止。然后,您可以继续测试更复杂的类。该的Mockito文档是一个伟大的地方开始学习嘲笑和单元测试。祝你好运!
| 归档时间: |
|
| 查看次数: |
4516 次 |
| 最近记录: |