在测试中覆盖调试模块

2024-01-01

我有一个 Gradle 应用程序,其项目结构类似于杰克·沃顿的 u2020 https://github.com/jakewharton/u2020:

/src
    /androidTest
    /debug
    /main
    /release

在我的应用程序类中,我构建了 Dagger 图表并注入它:

MyApplication extends Application {
      ...
      public void buildObjectGraphAndInject() {
          Object[] modules = Modules.list(this);
          mApplicationGraph = ObjectGraph.create(modules);
          mApplicationGraph.inject(this);
      }
      ...
}

在调试源集中,我定义Modules.list() as:

public final class Modules {
  public static Object[] list(MyApplication app) {
    return new Object[] {
        new AppModule(app),
        new DebugAppModule()
    };
  }

  private Modules() {
    // No instances.
  }
}

在发布源集中,我定义了相同的内容,但减去了 DebugAppModule:

public final class Modules {
  public static Object[] list(MyApplication app) {
    return new Object[] {
            new AppModule(app)
    };
  }

  private Modules() {
    // No instances.
  }
}

在依赖关系图的更深处,我创建了一个 MockRestAdapter,可以在运行调试版本时使用:

@Module(
    complete = false,
    library = true,
    overrides = true
)
public final class DebugApiModule {

  @Provides @Singleton Endpoint provideEndpoint(@ApiEndpoint StringPreference apiEndpoint) {
    return Endpoints.newFixedEndpoint(apiEndpoint.get());
  }

  @Provides @Singleton MockRestAdapter provideMockRestAdapter(RestAdapter restAdapter, SharedPreferences preferences) {
    MockRestAdapter mockRestAdapter = MockRestAdapter.from(restAdapter);
    AndroidMockValuePersistence.install(mockRestAdapter, preferences);
    return mockRestAdapter;
  }

  @Provides @Singleton MyApi provideMyApi(RestAdapter restAdapter, MockRestAdapter mockRestAdapter,
                                          @IsMockMode boolean isMockMode, MockMyApi mockService) {
    if (isMockMode) {
      return mockRestAdapter.create(MyApi.class, mockService);
    }
    return restAdapter.create(MyApi.class);
  }

}

但是当我运行测试时,我想用如下所示的 TestApiModule 覆盖 DebugApiModule:

@Module(
    complete = false,
    library = true,
    overrides = true
)
public final class TestApiModule {

  @Provides @Singleton Endpoint provideEndpoint(@ApiEndpoint StringPreference apiEndpoint) {
    return Endpoints.newFixedEndpoint(apiEndpoint.get());
  }

  @Provides @Singleton MockRestAdapter provideMockRestAdapter(RestAdapter restAdapter, SharedPreferences preferences) {
    MockRestAdapter mockRestAdapter = MockRestAdapter.from(restAdapter);
    mockRestAdapter.setDelay(0);
    mockRestAdapter.setErrorPercentage(0);
    mockRestAdapter.setVariancePercentage(0);
    return mockRestAdapter;
  }

  @Provides @Singleton MyApi provideMyApi(MockRestAdapter mockRestAdapter, MockHnApi mockService) {
      return mockRestAdapter.create(MyApi.class, mockService);
  }

}

实现这一目标的最佳方法是什么?我需要创建一个TestAppModule像这样:

public final class Modules {
  public static Object[] list(MyApplication app) {
    return new Object[] {
        new AppModule(app),
        new TestAppModule()
    };
  }

  private Modules() {
    // No instances.
  }
}

并替换所有的DebugFooModule with TestFooModules?如果是这样,我该如何解决这个事实Modules.java是重复的吗?还是我离基地太远了?

编辑:解决方案

我最终做的是在测试设置期间替换应用程序级图表(MockRestAdapter 的创建位置)

protected void setUp() throws Exception {
  super.setUp();
  HnApp app = HnApp.getInstance();
  app.buildObjectGraphAndInject(TestModules.list(app));
  getActivity();
}

到目前为止我所做的(我还不完全确定这会扩展)是在我的测试中创建一个静态测试模块类。

   @Module(
            injects = {
                    SharedPreferences.class
    })

      static  class TestModule {
            @Provides @Singleton SharedPreferences provideSharedPreferences(){
                return Mockito.mock(SharedPreferences.class);
            }
    }

在 setup() 方法中我注入测试模块

  @Before
    public  void setUp(){
        ObjectGraph.create(new TestModule()).inject(this);
}

然后我 @Inject 模拟类:

@Inject SharedPreferences sharedPreferences;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在测试中覆盖调试模块 的相关文章

随机推荐

  • 将项目属性设置为非文字字符串似乎在 leiningen 中不起作用

    拿一个简单的项目文件 defproject Sample clojure cloudbees 1 0 0 SNAPSHOT description 示例 clojure 应用程序 clojure 1 3 废话 你好 当我读到 获取项目 bl
  • 结合两个事件处理程序,jQuery

    我想在一个对象上观察两个事件 input blur function event ajaxSubmit this event preventDefault form submit function event ajaxSubmit this
  • 在 React 组件之间共享类实例对象

    比如说 如果我有一个使用单例模式实现的网络管理器类 export default class Manager private static Instance Manager public static get Instance Manage
  • “all (==1) [1,1..]”不终止的数学意义是什么?

    直觉上 我希望得到 数学 答案all 1 1 1 to be True因为列表中仅包含 1 的所有元素都等于 1 但是我理解 计算上 评估无限列表以检查每个元素实际上是否等于 1 的过程永远不会终止 因此表达式而是 评估 到底部或 我发现这
  • 为什么 emacs 24 找不到我添加的自定义主题?

    我的整个 emacs 设置是here https github com metaperl emacs 我加载了 init theme el 文件here https github com metaperl emacs blob master
  • 在 Yii 框架中,如何组合列并在下拉列表中显示为显示字符串

    我有一个dropDownList在我看来 它的人口来自clients表 该表包含类似的列first name last name id等等 现在我想展示first name and last name作为显示文本和id作为下拉列表中的值 我
  • 使用 jquery 返回上一页而不刷新,而不是 angularjs

    我正在本地运行一个脚本 在其中一个函数中 它会转到不同的页面 一旦完成 我希望它返回到上一页并继续在本地运行脚本 有没有办法在不刷新页面的情况下返回上一页 我用了parent history back 这将返回到上一页 但会刷新页面 以便我
  • Javadoc:package.html 或 package-info.java

    当尝试创建包级 Javadoc 注释时 首选方法是什么 你做什么工作 包信息 java Pros Newer Cons 滥用类 类用于代码 而不仅仅是注释 包 html Pros HTML 扩展意味着它不是代码 IDE 文本编辑器中的语法突
  • angularjs 一个元素上有两个指令

    我有两个指令 Generated by CoffeeScript 1 6 3 app directive focusMe function return scope focus focusMe link function scope ele
  • 获取 JPanel 上单击位置的颜色?

    我只想要一种在单击的像素为白色时激活的方法 我将如何实施这个 试图寻找一种返回坐标颜色的方法 但我找不到 依靠 如果你有一个缓冲图像 http java sun com j2se 1 4 2 docs api java awt image
  • 在 MVC 中上传文件时,字符串或二进制数据会被截断

    该文件只有 14kb 14 000 字节 我读过varbinary max 列类型 这就是我正在使用的 仅支持 8 000 字节 那是对的吗 如何将我的文件上传到数据库 if file ContentLength lt 3 1048576
  • 如何从非英语值创建一个 slug?

    我有模型Author有字段名字 姓氏 我想添加另一个字段 slug 它将包含字段串联的段 但是 这些字段包含非英语字符 我需要一个英语符号来创建链接模板 本地主机 作者 str slug 我该如何实施 要解决这个问题 您可以使用unidec
  • Docker - 无法在卷内的容器之间共享数据(docker-compose 3)

    我现在有一些用于 Web 应用程序的容器 nginx gunicorn postgres 和节点 用于从源代码构建静态文件和 React 服务器端渲染 在节点容器的 Dockerfile 中 我有两个步骤 构建和运行 Dockerfile
  • 使用 Rails 导入 gmail/yahoo/hotmail/aol 地址簿

    我想从 gmail hotmail yahoo 和 aol 地址簿中导入用户的地址簿 我正在 Rails 中寻找可以帮助我做到这一点的 gem 插件 任何帮助表示赞赏 Thanks 我一直在努力Contacts http github co
  • 从 Firebase 获取数据

    我正在尝试从 Firebase 获取数据 我尝试过这样的操作 FIREBASE REF childByAppendingPath tasks observeEventType Value withBlock snapshot gt Void
  • 如何让表头透明?

    我花了很多时间来解决这个问题 但仍然不明白我做错了什么 我需要我的标题是透明的 没有背景 举个例子 但我不明白透明度是如何工作的 我已经尝试了一切 但它总是白色的 透明度仅适用于文本 帮帮忙 我真的很期待 body margin 0 fon
  • 弹性容器内的居中元素正在增长并溢出到顶部之外[重复]

    这个问题在这里已经有答案了 我一定忘记了垂直和水平居中弹性盒的一些基本知识 容器位于具有垂直滚动的父级内 当容器变得太高时 它会超出父级顶部 从而剪切内容 底部保持原状 尝试调整视图的高度或添加更多线条以查看其实际效果 body html
  • 无法从 Microsoft Dynamics CRM WebAPI 调用 BulkDelete 操作

    我正在尝试致电批量删除 操作 https learn microsoft com en us previous versions dynamicscrm 2016 developers guide mt491158 v 3Dcrm 8 本地
  • 更改分支点

    我有一个分支叫feature它有一些提交 分支及其提交仍然位于我的机器本地 还没有push编辑到公共存储库 该图看起来像 A B C D E F G master P Q R feature 现在我意识到我应该建立分支feature脱离先前
  • 在测试中覆盖调试模块

    我有一个 Gradle 应用程序 其项目结构类似于杰克 沃顿的 u2020 https github com jakewharton u2020 src androidTest debug main release 在我的应用程序类中 我构