Dieser Abschnitt soll dem Engineering-Team einen 5-minütigen Überblick darüber geben, profilübergreifende Aufrufe funktionieren mit dem SDK und wie sie getestet werden können. Versuchen Sie noch nicht, etwas zu erstellen. Dieser Artikel dient nicht als Referenz oder Leitfaden, sondern nur als Einführung.
Benutzerdefinierte profilsensitive Klassen und Methoden
Mit dem verbundenen Apps SDK können Sie Ihre eigenen Klassen und Methoden als profilübergreifend. Dadurch werden Klassen und Methoden generiert, mit denen Sie die kommentierte Methode für jedes Profil ausführen können.
Sehen wir uns zum Beispiel die folgende Klasse mit der SDK-Annotation an:
public class CalendarDatabase {
@CrossProfile // SDK annotation
public void deleteEvent(Event event, Account account) {
// complex logic with database calls
}
}
Dadurch wird eine Klasse mit dem Präfix Profile generiert, mit der Sie diese API auf
Profil Ihrer Wahl. Beispiel: java
profileCalendarDatabase.work().deleteEvent(event, account);
Komplexere Beispiele
Realistisch gesehen werden Ihre Klassen und Methoden komplexer sein. Beispiel:
Ihre vorhandene API könnte ListenableFuture
-Rückgabetypen verwenden. Möglicherweise benötigen Sie
um Ergebnisse aus beiden Profilen zu kombinieren. Betrachten Sie dieses Beispiel:
public class CalendarDatabase {
@CrossProfile // SDK annotation
public ListenableFuture<Collection<Event>> getEvents() {
// complex logic with database calls
}
}
// Merge results from both profiles into a set
profileCalendarDatabase.both()
.getEvents()
.transform((Map<Profile, Collection<Event>> events) -> {
return events.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toSet());
}, directExecutor());
Diese generierten Klassen und Methoden funktionieren wie erwartet mit vollständiger Typsicherheit und IDE-Codevervollständigung.
Jeder Rückgabe- und Parametertyp Ihrer annotierten APIs muss vom
SDK, unterstützt aber vollständig Verschachtelungen und generische Elemente von Listen, Sets, Arrays,
Primitive, alle parierbaren Typen und alle serialisierbaren Typen sowie
ListenableFuture
, Optional
und Protos. Sie können auch weitere
Unterstützung für Typen, die vom SDK nicht nativ unterstützt werden. Als extremes Beispiel
würde ListenableFuture<List<Map<CustomProto,
CustomParcelableType[]>>>
nahtlos unterstützen.
Test
Das SDK vereinfacht das Testen von Einheiten. Für jede generierte Profilklasse
gibt es eine entsprechende FakeProfile
-Klasse, in der Sie Arbeit und
persönlichen Instanzen zu entwickeln. Beispiel:
// Create an instance of the SDK-generated fake connector class. This
// class lets you control the availability of the profiles, which
// profile you are now running on.
private final FakeCrossProfileConnector connector =
new FakeCrossProfileConnector();
// Create an instance of your real/fake/mock class for both profiles.
private final CalendarDatabase personalCalendarDatabase =
new FakeCalendarDatabase();
private final CalendarDatabase workCalendarDatabase =
new FakeCalendarDatabase();
// Create an instance of the SDK-generated fake profile-aware class.
private final FakeProfileCalendarDatabase profileCalendarDatabase =
FakeProfileCalendarDatabase.builder()
.personal(personalCalendarDatabase)
.work(workCalendarDatabase)
.connector(connector)
.build();
// Pass profileCalendarDatabase into your classes under test, or set
// Dagger up to inject the fake automatically.