具有Robolectic的Android AccessibilityService单元测试

时间:2018-07-08 14:19:58

标签: robolectric accessibilityservice

我写了一个AccessibilityService来捕获UI事件。我不是要创建单元测试来测试onAccessibilityEvent(final AccessibilityEvent event)方法。
我尝试过Uning Robolectric 1.创建一个按钮并调用callOnClick()方法。 2.创建一个AccessibilityEvent,然后调用我的Accessibility Service的onAccessibilityEvent(...)方法。

在创建按钮并调用testBtn.callOnClick()时,似乎没有调用AccessibilityService的onAccessibilityEvent方法。

当尝试直接调用onAccessibilityEvent方法时,出现以下错误: java.lang.IllegalStateException:无法在未密封的实例上执行此操作。 在AccessibilityService的以下行onAccessibilityEvent AccessibilityNodeInfo source = event.getSource();

是否可以启动我的AccessibilityService并测试onAccessibilityEvent方法?

@Before
    public void setUp(){
        this.accessibilityService = Robolectric.setupService(MyAccessibilityService.class);
        this.shadowService = shadowOf(this.accessibilityService);
    }

@Test
    public void roboTest(){
        this.accessibilityService.startService(new Intent());

        accessibilityService.performGlobalAction(AccessibilityEvent.TYPE_VIEW_CLICKED);
           AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_VIEW_CLICKED);
        accessibilityService.onAccessibilityEvent(event);


        Button testBtn = new Button(this.accessibilityService.getBaseContext());
        testBtn.setText("TestButton");
        testBtn.callOnClick();
        assertEquals(accessibilityService.retrieveLastAction(), "TYPE_VIEW_CLICKED");
    }

更多信息。
如果我创建一个AccessibilityEvent,请设置它的来源和其他一些值。然后尝试将AccessibilityEvent传递给方法并提取值,当我尝试获取源代码时,出现以下错误:

java.lang.IllegalStateException:无法在未密封的实例上执行此操作。

AccessibilityEvent accessibilityEvent = AccessibilityEvent.obtain();
 Button testBtn = new Button(RuntimeEnvironment.application);
        // Button is the event source I receive java.lang.IllegalStateException: Cannot perform this action on a not sealed instance.
        testBtn.setText("Text Button");
        testBtn.setId(1);
accessibilityEvent.setSource(testBtn);
        accessibilityEvent.setPackageName("com.draper.wash");
        accessibilityEvent.setEventType(AccessibilityEvent.TYPE_VIEW_CLICKED);

然后,我将此事件传递给(我的实际应用程序的)另一个类中的方法,该方法用于提取事件信息。到达终点线

AccessibilityNodeInfo source =  accessibilityEvent.getSource();

我收到: java.lang.IllegalStateException:无法在未密封的实例上执行此操作。

0 个答案:

没有答案