如何在Android中应用“问,别看”?

凯文·克鲁姆维德(Kevin Krumwiede)

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的东西组件需求没有ParcelableSerializable

史诗熊猫力量

我用的是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

问:如何在Access 2013中对数字进行分组?

来自分类Dev

如何在Android中应用buttonStyle?

来自分类Dev

如何在Android应用中包含反馈

来自分类Dev

如何在Android应用中包含反馈

来自分类Dev

如何在Android应用中实现SSO

来自分类Dev

如何在Android应用中打印消息

来自分类Dev

问:如何应用多元LASSO回归?

来自分类Dev

如何在多个版本的Android中测试我的Android应用

来自分类Dev

如何在android中的应用程序订阅中测试

来自分类Dev

如何在Android中的通知中打开应用程序?

来自分类Dev

问:如何在Flutter中实现新的OutlinedButton小部件上的圆角?

来自分类Dev

问:如何在 UML 状态机转换中处理多个条件

来自分类Dev

问:如何在不使用 XPath 的情况下从网页中查找某个部分

来自分类Dev

如何在Android的标题栏中隐藏应用名称?

来自分类Dev

如何在Android应用中管理Google Play服务更新?

来自分类Dev

如何在基于设备的cordova android应用中限制方向?

来自分类Dev

如何在Android应用程序中收集LogCat消息

来自分类Dev

如何在我的Android应用中更新SSL证书?

来自分类Dev

如何在Android应用程序中构建ffmpeg?

来自分类Dev

如何在react-native android应用中显示GIF?

来自分类Dev

如何在android中处理多个应用程序类

来自分类Dev

如何在我的Android应用中显示Google Earth视图

来自分类Dev

如何在Android应用中绕过SSL证书验证?

来自分类Dev

如何在Android中启动默认音频录制应用

来自分类Dev

如何在Android应用程序中存储数据

来自分类Dev

如何在Android应用中显示Sinhala Unicode字符

来自分类Dev

如何在python android应用中添加广告

来自分类Dev

如何在Android应用中按时间限制操作?

来自分类Dev

如何在Android应用中执行Google图片搜索

Related 相关文章

  1. 1

    问:如何在Access 2013中对数字进行分组?

  2. 2

    如何在Android中应用buttonStyle?

  3. 3

    如何在Android应用中包含反馈

  4. 4

    如何在Android应用中包含反馈

  5. 5

    如何在Android应用中实现SSO

  6. 6

    如何在Android应用中打印消息

  7. 7

    问:如何应用多元LASSO回归?

  8. 8

    如何在多个版本的Android中测试我的Android应用

  9. 9

    如何在android中的应用程序订阅中测试

  10. 10

    如何在Android中的通知中打开应用程序?

  11. 11

    问:如何在Flutter中实现新的OutlinedButton小部件上的圆角?

  12. 12

    问:如何在 UML 状态机转换中处理多个条件

  13. 13

    问:如何在不使用 XPath 的情况下从网页中查找某个部分

  14. 14

    如何在Android的标题栏中隐藏应用名称?

  15. 15

    如何在Android应用中管理Google Play服务更新?

  16. 16

    如何在基于设备的cordova android应用中限制方向?

  17. 17

    如何在Android应用程序中收集LogCat消息

  18. 18

    如何在我的Android应用中更新SSL证书?

  19. 19

    如何在Android应用程序中构建ffmpeg?

  20. 20

    如何在react-native android应用中显示GIF?

  21. 21

    如何在android中处理多个应用程序类

  22. 22

    如何在我的Android应用中显示Google Earth视图

  23. 23

    如何在Android应用中绕过SSL证书验证?

  24. 24

    如何在Android中启动默认音频录制应用

  25. 25

    如何在Android应用程序中存储数据

  26. 26

    如何在Android应用中显示Sinhala Unicode字符

  27. 27

    如何在python android应用中添加广告

  28. 28

    如何在Android应用中按时间限制操作?

  29. 29

    如何在Android应用中执行Google图片搜索

热门标签

归档