我写了一个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:无法在未密封的实例上执行此操作。