在测试中覆盖调试模块

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(使用前将#替换为@)

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

  • 两个 ListView 和 ScrollView

    我离这里很近 我已经尝试了很多东西 但无法让它发挥作用 我这里有两个列表视图 我想要的是每个列表视图显示其全部内容 我不希望列表视图可滚动 我想要保持列表视图可滚动的滚动视图 我能得到的最接近的结果 这是错误的 是每个列表视图都是可滚动的
  • ScrollView 与relativelayout 不能很好地配合

    所以我有一个 ScrollView 作为布局中的最高级别 在我的 ScrollView 中我有一个包含其他视图的相对布局 问题在于 RelativeLayout 没有按应有的方式覆盖整个布局 它会在大约一半的屏幕处被截断 它的宽度是屏幕的整
  • 安卓。 onEditorAction 从未被调用

    我正在尝试捕捉从屏幕上移除键盘的事件 并且我正在使用OnEditorActionListener班级 然而 其onEditorAction方法永远不会被调用 这是我的 XML 格式的 EditText
  • 无法将 LocalBroadcastManager 添加到 Android Studio 中的项目

    我想我现在已经尝试了一切 我一直在堆栈溢出 我什至咨询过android文档 这里的大多数帖子都展示了如何在 Eclipse 中添加 jar 文件 android 工具 gt 添加支持库 或其他内容 所以我尝试按照文档告诉我的方式进行操作 方
  • 错误的本机调用堆栈

    我在 crashylitics 显示本机崩溃的正确调用堆栈时遇到问题 它以前可以工作 但现在调用堆栈要么没有意义 要么名称丢失 我已通过查看 crashylitics 日志文件来确保符号正在上传 那里一切看起来都很好 我进行了一次崩溃测试
  • Android:使用 ActivityResultLauncher 时如何区分多个意图

    我正在创建一个意图选择器来在手机相机应用程序和图库 文件管理器之间进行选择 Intent chooserIntent Intent createChooser clickPhoto Set Image Using chooserIntent
  • Audiomanager 扬声器不工作

    我正在尝试在通话时启用扬声器 final AudioManager audioManager AudioManager context getSystemService Context AUDIO SERVICE audioManager
  • 如何动态设置每个 Gridview 图像项的边框

    我想显示每个 gridview 项目的不同边框 我如何动态地为每个项目设置边框
  • BroadcastReceiver:以编程方式设置 android:process

    我希望我的应用程序能够检测外部存储的状态何时发生变化 首先在我的AndroidManifest xml中定义了一个BroadcastReceiver 这里我可以设置android process and android exported像这
  • 在 Android 中使用 lambdaj

    有人尝试过在android开发中使用lambdaj库吗 当我创建一个简单的小型java应用程序时 它对我来说工作得很好 但我无法在android应用程序中使用它 UPDATE 我正在添加 lambdaj lambdaj 2 3 2 with
  • Android中如何使用ScrollView?

    我有一个 XML 布局文件 但文本超出了屏幕尺寸 我需要做什么才能制作ScrollView
  • 在 Java 和 PHP 之间加密/解密字符串

    我使用 AES 加密来加密和解密服务器端的 php 和 Android 应用程序 作为客户端 之间的字符串 PHP 中的加密字符串为 HaxRKnMxT24kCJWUXaVvqDHahzurJQK sYA4lIHql U 在 Java 中是
  • 方向更改时视图高度/宽度值错误?

    我实现了 onConfigurationChanged 来读取方向配置更改时视图高度和宽度的值 Override public void onConfigurationChanged Configuration newConfig supe
  • 如何限制 Android 设备网络速度以进行测试

    我正在测试一个 Android 应用程序 该应用程序在低质量网络上管理其内容时遇到一些问题 我无法验证问题是否仍然存在 因为以我家的网络速度 120mb s 在我设法开始复制路线之前 所有内容都已经下载完毕 在这种情况下 不能选择使用 An
  • Android 中每个 dex 文件的方法限制为 64K

    我遇到了这个问题java lang IllegalArgumentException method ID not in 0 0xffff 65536我决定从 dex 文件中排除一些方法 我的 gradle build compile com
  • 如何在运行时将元数据信息写入Android Manifest

    我知道可以编辑 Android 清单组件 例如 将其设置为启用 禁用等 我想在运行时将元值标签插入到 Android 清单的应用程序标签中 我怎样才能直接写入android清单 这是我想直接写入我的应用程序的 Android 清单中的字符串
  • 如何使用 Retrofit 从异步回调返回 String 或 JSONObject?

    例如 调用 api getUserName userId new Callback
  • unityLibrary:compileDebugJavaWithJavac

    所以当我单击 构建项目 时 它显示 零错误 但我仍然得到这个 Executing tasks clean unityLibrary assembleDebug launcher assembleDebug in project C User
  • Android:如何以编程方式仅圆化位图的顶角?

    我目前正在使用这段代码 Override public Bitmap transform Bitmap source Bitmap result Bitmap createBitmap source getWidth source getH
  • Spotify API:INVALID_APP_ID

    我目前正在开发一个实现 Spotify API 的 Android 应用程序 我已经使用教程将我的应用程序连接到 Spotify 的所有代码 并且已经在我的应用程序上工作了一段时间了 当我在验证用户身份后通过我的应用程序播放歌曲时 它在我的

随机推荐

  • 将项目属性设置为非文字字符串似乎在 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 在我的应用程序类中 我构