模拟Android AssetManager

2024-04-14

我有一段代码接受 Context 并将该上下文传递给私有方法。 私有方法调用 getAssets().open() 来读取我的应用程序的资产文件夹中存在的文件。

public void methodA(Context ctx) throws IOException{
     // do some stuff here...
     Object data[] = getFileContents(ctx);
     // use the data[] returned here...

}

private Object[] getFileContents(Context ctx) throws IOException{
     Object[] data;
     BufferedInputStream is = new BufferedInputStream(context.getAssets().open("test.txt"));
     // parse file and create array of Objects[]
     return data[];
}

我正在编写单元测试来使用 Mockito 测试 method() ,以便我可以测试传递垃圾数据或在测试用例中抛出异常。

问题是我无法在android中模拟AssetManager类(它是Final)。

我尝试使用 InstrumentationTestCase 注入真实和测试上下文,但这仅适用于少数场景。 如何控制 BufferedInputStream 以便我可以为其提供任何我想要的输入(使用模拟或其他方式)?


我不得不处理同样的问题。这就是我在不使用仪器测试的情况下设法从单元测试程序访问配置文件的方法。 (我使用Android Studio 2.1)。

单元测试代码:

public class ParametersTest {

    Parameters parameters = null;

    @Mock
    Context context;
    @Mock
    AssetManager assetManager;
    @Mock
    InputStream inputStream;

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);//create all @Mock objetcs
        doReturn(assetManager).when(context).getAssets();
        //parametersandroid.xml is located in test/resources directory
        //parametersandroid.xml does not refer to a DTD file configuration.dtd
        //get the full path name of the file
        URL resource = ParametersTest.class.getClassLoader().getResource("parametersandroid.xml");
        // to be used  MyClass
        // inside the method I want to be tested there is this statement :
        // InputStream inputStream = this.assetManager.open(xmlFile);
        InputStream inputStream=new FileInputStream(resource.getPath());
        doReturn(inputStream).when(assetManager).open(anyString());
       // AssetManager assetManager = context.getAssets();
       // parameters = new Parameters(assetManager, resource.getPath());
        parameters = new Parameters(context, resource.getPath());

    }
    @Test
    public void testExtract() throws Exception {
       assertEquals(parameters.extract("//database/index[@name='TeamNameIdx']/create").replaceAll("[^a-z,A-Z,;,.,?,']", ""),"createindexTeamNameIdxonTeamEntnameasc;");
    }
}

待测试类的代码:

public class Parameters extends fr.acnice.valade.eric.gemara.utilities.Parameters {
    private AssetManager assetManager = null;

    public Parameters(Context context, String xmlFile) {
        super(xmlFile);
        this.assetManager = context.getAssets();
    }
    @Override
    public String extract(String request) throws XPathExpressionException,
            Exception {
        InputStream inputStream = this.assetManager.open(super.xmlFile);
        String result = (String) xPath.evaluate(request, new InputSource(inputStream),
                XPathConstants.STRING);
        if (result.isEmpty()) {
            throw new Exception(
                    "Xpath result empty !!! check configuration file");
        }
        return result;
    }

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

模拟Android AssetManager 的相关文章

  • 如何在出现“无法解析放置符号”错误时向哈希图添加键和值

    我正在与安卓工作室 https en wikipedia org wiki Android Studio1 4 1 我刚刚创建了一个 Hashmap 并正在遵循有关如何填充和操作它的教程 Java 语言 但是 我收到 无法解析符号放置 错误
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • 在 WebView 中完成 AdBlock

    我即将在我的 Android 应用程序中推出 WebView AdBlocking 我想知道这是否会有效地阻止广告 或者在 Webview 本身内是否还有更多工作要做 我尚未修改 基本上我有一个存储在 Android 资产中的主机文件 其中
  • 为什么按钮上的 maxWidth 不起作用以及如何解决它?

    我的布局上有两个按钮 在大屏幕设备 平板电脑 上我想限制它们的宽度 这样它们看起来就不会很荒谬 我希望使用 maxWidth 属性 但它显然在我的场景中没有任何作用 这是布局定义 按钮使用布局的整个宽度 忽略 maxWidth 中的任何值
  • 监听什么来检测 Android 中的请勿打扰模式更改?

    我希望我的应用程序在手机设置为请勿打扰模式 仅限闹钟 仅限优先级或完全静音 时显示通知 通过聆听 这效果非常好android media RINGER MODE CHANGED在快速设置中检查此模式并在已选择的选项卡中选择模式时 但是 当选
  • AnalyticsService 未在应用程序清单中注册 - 错误

    我正在尝试使用 sdk 中提供的以下文档向 Android 应用程序实施谷歌分析服务 https developers google com analytics devguides collection android v4 https d
  • Android Web Intent 问题

    G day 免责声明 我不是 Android 开发人员 我正在对我所描述的问题进行质量检查 我用来描述这个问题的技术术语可能是错误的 我正在测试一个 Android 应用程序 该应用程序在其清单中描述它可以使用 type 的地址处理 Web
  • Android 改变 ImageView / Bitmap 的颜色

    我需要找到一种方法来改变 Android 中位图的颜色 我需要在我的应用程序中平滑地替换 更改椭圆形图像的颜色 具体取决于int价值 我需要类似的东西myValue 5比改变我的图像的颜色RED and if myValue 322将颜色更
  • 如何在android中的操作栏中创建Edittext?

    我们可以在操作栏中使用编辑文本吗 在阅读了 Google 中的大量资源后 我找不到如何在操作栏中创建编辑文本 谁能告诉我该怎么做 您可以设置自定义View为了ActionBar像这样 getActionBar setCustomView R
  • jar 中的 apklib 有什么优点?

    我正在关注这个问题 https stackoverflow com questions 6059502 whats the difference between apklib and jar files但它并没有完全回答我的问题 jar 中
  • android 中camera.setParameters 失败

    我已将相机功能包含在我的应用程序中 我还在市场上推出了该应用程序 我从一位用户那里收到一条错误消息 称他在打开相机时遇到错误 我已经在 2 1 的设备上测试了该应用程序 我从用户那里得到的错误是使用 Nexus One 它主要运行 2 2
  • 删除Android所有语言中的字符串

    我有一个包含多个翻译的应用程序 我想删除一些字符串 我怎样才能重构并删除它们一次 例如在默认情况下strings xml文件并自动将删除传播到其他翻译的其他 strings xml 文件 您可以通过 Android Studio 中的 翻译
  • 使用嵌套的 hashmap 参数发送 volley 请求

    我正在使用 android volley 框架向我的服务器发送 jsonobject 请求 get 请求工作正常 现在我想发送一个带有请求参数的 post 请求 该请求参数是嵌套的 hashmap 我重写 getparams 方法 但它期望
  • Android:打开和关闭SQLite数据库

    我正在开发Android应用程序 我经常在其中访问本地数据库 该数据库可以从不同的主题访问 因此我遇到了数据库的协调问题 我使用以下open and close method public void open mDb mDbHelper g
  • 单元测试失败,异常代码为 c0000005

    我正在尝试使用本机单元测试项目在 Visual Studios 2012 中创建单元测试 这是我的测试 TEST METHOD CalculationsRoundTests int result Calculations Round 1 0
  • Android - iphone 风格 tabhost [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 Android 布局 xml 文件中使用字符串格式参数 [重复]

    这个问题在这里已经有答案了 我在 String xml 文件中定义了一个使用格式参数的字符串 即
  • 更改Android菜单的背景颜色[重复]

    这个问题在这里已经有答案了 我正在尝试将标准浅灰色更改为浅绿色 似乎没有一个简单的方法可以做到这一点 例如 通过 Android 主题 但我找到了一个解决方法 如本页所述 http tinyurl com 342dgn3 http tiny
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 通过 Web 界面执行 python 单元测试

    是否可以通过 Web 界面执行单元测试 如果可以 如何执行 EDIT 现在我想要结果 对于测试 我希望它们是自动化的 可能每次我对代码进行更改时 抱歉我忘了说得更清楚 EDIT 这个答案此时已经过时了 Use Jenkins https j

随机推荐

  • 下载错误或资源不是有效图像

    尝试使用清单中的以下图标时出现错误 http localhost 3000 logo192 png http localhost 3000 logo192 png 下载错误或资源不是有效的图像 从控制台 import React from
  • Firebase Cloud Messaging 订阅多个令牌到一个主题

    我有一个允许用户创建帐户的应用程序 然后 我将用户信息存储在 Firebase 数据库中 我还存储所有用户的设备令牌 以防他们通过一个帐户使用多台设备 iPhone iPad Android 等 当用户订阅某个主题时 我希望能够订阅该主题的
  • 如何避免 OSX 上自制程序中的“无法加载此类文件 -- utils/popen”

    我运行时遇到错误brew在终端中 System Library Frameworks Ruby framework Versions 2 0 usr lib ruby 2 0 0 rubygems core ext kernel requi
  • Capifony 和目录所有者

    When I cap deploy我的 Symfony2 项目 然后登录到我的服务器 我看到 dev app dev php 运行正常 但 prod 版本 app php 运行正常 错误是 Tue Jan 03 14 31 48 2012
  • 设置overflow-y也会导致overflow-x发生变化[重复]

    这个问题在这里已经有答案了 当我设定overflow y在一个街区上 它似乎正在影响overflow x财产 我做了一个JSFiddle 提供了此问题的示例 http jsfiddle net sgjennings 7fNhx 这似乎发生在
  • 将对象传递给 AutoMapper 映射

    我正在使用 AutoMapper 被映射到的实体的一些值是我当前方法中的变量 我尝试用谷歌搜索但没有成功 我可以将一组键值对或一个对象或其他东西传递给我的映射以使其使用这些值吗 映射后修改示例 comment variable is a C
  • 如何使用 Node.JS 通过 XMPP 发送 HTML 格式的消息?

    这个问题讨论使用node xmpp发送消息 在 Node js 上通过 XMPP 连接到 Google Talk https stackoverflow com questions 4349577 connecting to google
  • python - 池映射的字典迭代器

    我正在处理一组冻结集 我试图在字典 输出 中找到每个冻结集的最小集 我有 70k freezesets 所以我正在制作这个 freezeset 字典的块并并行化这个任务 当我尝试将此字典作为我的函数的输入传递时 仅发送密钥 因此我收到错误
  • 按组列出的最常见值(众数)[重复]

    这个问题在这里已经有答案了 我试图按组找到最常见的值 在以下示例数据框中 df lt data frame a c 1 1 1 1 2 2 2 3 3 b c 2 2 1 2 3 3 1 1 2 gt df a b 1 1 2 2 1 2
  • 标签助手“input”在元素的属性声明区域中不得包含 C#

    在构建最近从 NET Core 2 2 迁移到 3 0 的 ASP NET Core MVC 应用程序时 我们遇到以下错误 标签助手 input 或 textarea 或任何其他 不得具有 C 在元素的属性声明区域中 我们用的是剃须刀 fu
  • android EditText maxLength 允许用户输入更多内容

    我已经在 xml 布局文件中为 EditText 小部件设置了 maxLength 属性 它确实限制了字符的显示 但它仍然允许用户在键盘上按更多字母 并且退格键会删除这些额外的按键 而不是显示屏上的最后一个字母 我相信事情不应该是这样的 达
  • Django项目中大量页面如何组织分页?

    我有一个view py产品列表 from django shortcuts import render get object or 404 from models import ProductCategory Product Product
  • VB.net中是否有像SQL中那样的IN运算符

    是否有类似的函数或运算符 If RoleName in Val1 Val2 Val2 Then Go End If 代替 If RoleName Val1 Or RoleName Val2 Or RoleName Val2 Then Go
  • 有人可以解释这种行为吗?只需两行代码[重复]

    这个问题在这里已经有答案了 请解释一下这个片段 include
  • Bulbflow:neo4jserver Graph 和 neo4jserver Neo4jclient 之间的区别

    我现在正在尝试学习如何连接到 Neo4j 服务器并使用 Python 中的 Bulbflow 在其上运行 Cypher 查询 我不明白的是连接到 neo4j 服务器的两种可能性之间的区别 1 Graph http bulbflow com
  • 包含 std::string 常量的类

    所以我目前正在使用 C 进行一个学校项目 我对此并不熟悉 我想创建一个类 包含我所有的常量 字符串 整数 双精度 自己的类 我正在尝试这个 这在 Java 中一直对我有用 class Reference Picture Paths publ
  • 使用 TensorFlow 对象检测输出分数、类别和 ID 提取

    如何提取由用于对象检测的 Tensorflow 模型生成的图像中检测到的对象 对象类别 对象 ID 的输出分数 我想将所有这些详细信息存储到单独的变量中 以便以后将它们存储在数据库中 使用与此链接中找到的相同的代码https github
  • 两个日期之间的输出 mysql [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要像这样在MYSQL中输出 记录
  • 在 mongodb 中创建安全数据库

    我想在 mongodb 中创建安全的数据库 安全意味着应用程序必须传递用户名 密码才能连接到我的 mongodb 数据库 来自 Mongo Java 教程 MongoDB 可以在安全模式下运行 其中通过名称和密码身份验证控制对数据库的访问
  • 模拟Android AssetManager

    我有一段代码接受 Context 并将该上下文传递给私有方法 私有方法调用 getAssets open 来读取我的应用程序的资产文件夹中存在的文件 public void methodA Context ctx throws IOExce