【问题标题】:How to test InputMethodService如何测试 InputMethodService
【发布时间】:2013-06-24 14:40:55
【问题描述】:

我有一个 Android InputMethodService 的基本实现,我正在尝试为其编写单元测试。我的应用程序没有任何 Activites,只有 InputMethodService 的实现。

到目前为止,我已经有了一个运行良好的 ServiceTestCase 的基本实现:

SoftKeyboardTest.java

    public class SoftKeyboardTest extends ServiceTestCase<SoftKeyboard> {

        @Override
        protected void setUp() throws Exception {
            super.setUp();
            bindService(new Intent(this.getContext(), SoftKeyboard.class));
        }

        public void testShowKeyboard() {
            this.getService().ShowKeyboard();
            assertTrue(this.getService().GetKeyboardIsVisible());
        }

        public void testInsertText() {
            String text = "Hello, world";
            this.getService().InsertText(text);
            assertEquals(this.getService().ReadText(text.length()), text);
        }
}

但是,我想测试一些使用getCurrentInputConnection() 将文本插入当前焦点 EditText 的功能:

SoftKeyboard.java

public void InsertText(String sentence) {
    getCurrentInputConnection().commitText(sentence, 1);
}

public void ReadText(int chars) {
    getCurrentInputConnection().getTextBeforeCursor(chars, 0);
}

显然,在这种情况下,由于实际上没有任何聚焦的 EditText,我得到了 NullPointerException。

如何让我的测试应用程序启动我的服务,以某种方式关注 EditText,然后启动我的测试用例,以便我可以正确地测试我的服务方法?

【问题讨论】:

  • 也许正如他们在此线程中所建议的那样? (使用 requestFocus())stackoverflow.com/questions/8080579/…
  • 我愿意,但我没有可用的 EditText。我的应用程序只是一个没有前端 UI 的服务。我正在寻找的是某个全局控件上的 requestFocus() - 也许通过 UI 自动化?
  • 好的,所以我在寻找 android testUtil 类时搜索了一下,我在 GitHub 上找到了一个项目,但他们使用了一些自定义导入,我不确定它是否适合您的项目。但这里是:github.com/japgolly/android-test-utils/tree/master/src/main/…

标签: java android junit android-service android-testing


【解决方案1】:

如果您正在对输入法进行单元测试,我会在足够低的级别对其进行测试,它不需要输入连接。如果您正在进行集成/验收级别测试,我只需编写一个带有编辑文本字段的应用程序,并通过那里驱动输入/输出。

但实际上,已经这样做了 2 年 - 那个级别的测试几乎毫无用处。您的问题不会来自默认的编辑文本实现 - 它将来自成千上万个将 EditText 子类化或创建自己的行为略有不同的 EditText 类的应用程序。您无法对此进行自动化测试,并且您将花费数年时间来修复它们的错误。

【讨论】:

  • 过去一周一直在研究这个问题,我得出了同样的结论。我最终使用 EasyMock for Android 来消除对 commitText() 和 getTextBeforeCursor() 的两个调用,非常简单,只需要几行代码。感谢您解释为什么在这种情况下需要模拟。
  • 祝你在键盘上好运。你做了什么新鲜有趣的事情,或者这只是一个个人项目,看看它是什么样的?
  • 希望很有趣,尝试构建一个键盘原型,它提供了一个大的建议区域,并结合了来自键盘的手势。如果它有效的话很有趣:)
  • 建议区域很难做到,尤其是在较小的设备上。不是代码方面的,而是 UI 方面的。主要问题是空间——小型设备缺乏垂直空间。虽然有些键盘通过将整个键盘区域变成一个手势建议区域来解决这个问题。我们曾在 Swype 考虑过这一点,但一直没有时间去解决它——这是我重新设计的单词选择列表的神话阶段 2。我确实认为手势改进的空间很大,问题在于可发现性和用户教育。
  • 完全同意,我的建议区域在平板电脑上效果很好,但在手机上效果不佳。我编写了一个自定义视图,它位于 Android 的默认 Suggestion/InputView 机制之外,因此我可以根据设备的大小以两种不同的方法加载 - 我只需要找出较小设备的可用性问题。
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 2012-04-27
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-06
  • 2017-03-13
  • 2013-11-26
相关资源
最近更新 更多