【发布时间】:2016-05-08 21:38:21
【问题描述】:
我最近开始使用 Dagger 2 来管理我的应用程序的依赖注入。为了使某些类可测试,我开始创建许多需要注入的类。我能够这样做,但是,注入这些新类的过程对我来说有点复杂。举个例子:
例如,我想测试我的 RecyclerViewAdapter 中的方法 onCreateViewHolder()。为此,我创建了一个工厂,它根据给定的 LayoutType 返回 ViewHolder:
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);
}
}
通过将上面的代码移动到一个单独的类中,我可以使用以下方法执行我的单元测试:
@RunWith(JUnit4.class)
public class TestViewHolderFactor extends TestCase {
ViewHolderFactor viewHolderFactor;
@Test
public void testGetViewHolder () {
this.viewHolderFactor = Mockito.mock(ViewHolderFactor.class);
ViewGroup viewGroup = Mockito.mock(ViewGroup.class);
Mockito.when(viewHolderFactor.getViewHolder(viewGroup, LayoutType.SMALL_VERTICAL.toInteger())).thenCallRealMethod();
Context context = Mockito.mock(Context.class);
Mockito.when(viewGroup.getContext()).thenReturn(context);
LayoutInflater layoutInflater = Mockito.mock(LayoutInflater.class);
Mockito.when(viewHolderFactor.getLayoutInflater(context)).thenReturn(layoutInflater);
Mockito.when(layoutInflater.inflate(R.layout.rsc_util_item_small, viewGroup, false)).thenReturn(Mockito.mock(View.class));
RecyclerView.ViewHolder result = viewHolderFactor.getViewHolder(viewGroup, LayoutType.SMALL_VERTICAL.toInteger());
assertNotNull(result);
}
}
问题是:现在,为了使应用程序正常工作,我还必须注入保存因子实例的外部类(在创建 ViewHolderFactor 之前我没有这样做)。最后,我会有一个这样的 Dagger 配置:
@Module
public class ModuleBusiness {
@Provides
public CharacterUIService provideCharacterService(Picasso picasso, NotificationUtil notificationUtil, ViewHolderFactor viewHolderFactor) {
return new CharacterUIService(picasso, notificationUtil, viewHolderFactor);
}
}
其中 CharacterUIService 是创建包含 ViewHolderFactory 的 RecyclerViewAdapter 的新实例的类。
public class
private ViewHolderFactor
@Inject
public CharacterUIService(ViewHolderFactor viewHolderFactor) {
this.mViewHolderFactor = viewHolderFactor;
}
// ...
}
我需要 ViewHolderFactor 的成员才能注入它。
我担心需要创建新的全局变量并增加构造函数中传递的参数数量。有没有更好的方法来注入这些子类,或者我可以将其视为允许单元测试的良好做法?
【问题讨论】:
-
顺便说一句:“factor”这个词在英文中与“factory”相差甚远,因此您可以考虑更正您的代码措辞。
-
你说得对,是打字失误。已经修复了
标签: android dependency-injection dagger dagger-2