Ich benutze seit kurzem Dagger 2, um die Abhängigkeiten meiner App zu verwalten. Um einige Klassen testbar zu machen, habe ich angefangen, viele Klassen zu erstellen, die ich injizieren muss. Ich konnte das machen, aber der Prozess, um diese neuen Klassen zu bekommen, sieht für mich etwas kompliziert aus. Nehmen wir ein Beispiel:Was ist der beste Weg Subklassen mit Dagger 2 zu injizieren?
Ich möchte zum Beispiel die Methode onCreateViewHolder()
von meinem RecyclerViewAdapter testen. Dazu habe ich eine Fabrik erstellt, die die ViewHolder auf der gegebenen LayoutType basiert zurückgibt:
public class ViewHolderFactor {
public RecyclerView.ViewHolder getViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = this.getLayoutInflater(parent.getContext());
View view;
switch (LayoutType.fromInteger(viewType)) {
case SMALL_VERTICAL:
view = inflater.inflate(R.layout.rsc_util_item_small, parent, false);
return new ViewHolder.ItemViewHolder(view);
case LARGE_VERTICAL:
view = inflater.inflate(R.layout.rsc_util_item_large, parent, false);
return new ViewHolder.ItemViewHolder(view);
}
return null;
}
private LayoutInflater getLayoutInflater(Context context) {
return LayoutInflater.from(context);
}
}
Durch den obigen Code zu einer getrennten Klasse bewegen, ich bin in der Lage zu meiner Einheit Test durchführen mit:
Problem ist: Jetzt, um die App arbeiten zu lassen, muss ich auch die Fremdklasse injizieren, die eine Instanz an den Faktor hält (etwas, was ich nicht getan habe, bevor ich ViewHolderFactor erstellt habe). Am Ende werde ich eine Dolch Konfiguration wie das hat:
@Module
public class ModuleBusiness {
@Provides
public CharacterUIService provideCharacterService(Picasso picasso, NotificationUtil notificationUtil, ViewHolderFactor viewHolderFactor) {
return new CharacterUIService(picasso, notificationUtil, viewHolderFactor);
}
}
Wo CharacterUIService ist die Klasse, die eine neue Instanz des RecyclerViewAdapter erzeugt, den die ViewHolderFactory enthält.
public class
private ViewHolderFactor
@Inject
public CharacterUIService(ViewHolderFactor viewHolderFactor) {
this.mViewHolderFactor = viewHolderFactor;
}
// ...
}
Ich brauche ein Mitglied von ViewHolderFactor, um es zu injizieren.
Meine Sorgen betrachten die Notwendigkeit, neue globale Variablen zu erstellen und die Anzahl der Parameter, die im Konstruktor übergeben werden, zu erhöhen. Gibt es eine bessere Möglichkeit, diese Unterklassen zu injizieren, oder kann ich es als eine gute Übung betrachten, Unit-Tests zuzulassen?
BTW: Wort "Faktor" ist ziemlich weit von "Fabrik" in Englisch, so dass Sie möglicherweise in Betracht ziehen, Ihre Code-Formulierung zu korrigieren. –
Sie haben Recht, es war Miss tippen. bereits behoben –