此Google Testing Blog帖子列出了一些使代码可测试的策略。一项内容部分说明:
索要东西,不要寻找东西(又名依赖注入/ Demeter定律):好的,您在应用程序代码中摆脱了新的运算符。但是我如何掌握依赖关系。简单:只需在构造函数中询问您需要的所有协作者即可。
换句话说,执行以下操作:
Foo(final Bar bar) {
mBar = bar;
}
不是这个:
Foo() {
mBar = Bar.getBar(); // or new Bar();
}
这样做的原因很明显:它允许您Foo
通过传递模拟来进行测试Bar
。由于Android组件需要no-arg构造函数,因此等效方法是通过extras传递其参数Bundle
。
你如何将这一原则在Android的东西组件需求没有Parcelable
或Serializable
?
我用的是Dagger2,在这里您仅依赖对象图(或其子作用域扩展子图之一)来接收所有依赖项。
大概是这样的,
。
@Component(modules={SingletonModule.class})
@Singleton
public interface SingletonComponent {
Foo foo();
Bar bar();
void inject(MainActivity mainActivity);
}
@Module
public class SingletonModule {
@Provides
@Singleton
public Bar bar() {
return new Bar();
}
@Provides
@Singleton
public Foo foo(Bar bar) {
return new Foo(bar);
}
}
public class CustomApplication extends Application {
SingletonComponent singletonComponent;
@Override
public void onCreate() {
super.onCreate();
singletonComponent = DaggerSingletonComponent.builder()
.singletonModule(new SingletonModule())
.build();
}
public SingletonComponent getSingletonComponent() {
return singletonComponent;
}
}
public class MainActivity extends Activity {
@Inject
Foo foo;
@Inject
Bar bar;
@Override
public void onCreate(Bundle saveinstanceState) {
super.onCreate(saveinstanceState);
((CustomApplication)getApplicationContext()).getSingletonComponent().inject(this);
bar.doSomething();
foo.doSomething();
}
}
。
@Component(modules=SingletonModule.class)
@Singleton
public interface SingletonComponent {
Foo foo();
}
@Component(dependencies={SingletonComponent.class}, modules={MainActivityModule.class})
@ActivityScope
public interface MainActivityCompoent extends SingletonComponent {
Bar bar();
void inject(MainActivity mainActivity);
}
@Module
public class SingletonModule {
@Provides
@Singleton
public Foo foo() {
return new Foo();
}
}
@Module
public class MainActivityModule {
@Provides
@ActivityScope
public Bar bar(Foo foo) {
return new Bar(foo);
}
}
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityScope {
}
public class CustomApplication extends Application {
SingletonComponent singletonComponent;
@Override
public void onCreate() {
super.onCreate();
singletonComponent = DaggerSingletonComponent.builder()
.singletonModule(new SingletonModule())
.build();
}
public SingletonComponent getSingletonComponent() {
return singletonComponent;
}
}
public class MainActivity extends Activity {
@Inject
Foo foo;
@Inject
Bar bar;
private MainActivityComponent mainActivityComponent;
@Override
public void onCreate(Bundle saveinstanceState) {
super.onCreate(saveinstanceState);
mainActivityComponent = DaggerMainActivityComponent.builder()
.singletonComponent(((CustomApplication)getApplicationContext()).getSingletonComponent())
.mainActivityModule(new MainActivityModule())
.build();
mainActivityComponent.inject(this);
bar.doSomething();
foo.doSomething();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句