gpt4 book ai didi

android - InputMethodService 的仪器测试用例

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:12 26 4
gpt4 key购买 nike

我已经扩展了 InputMethodService类来创建我的自定义 IME。但是,我正在努力编写有效的 Instrumentation 测试用例来验证行为。以前是 Service , 可以使用 ServiceTestCase<YourServiceClass> 进行测试.但它似乎已被弃用,新格式看起来像 this .现在在给定的指导方针中,我正在努力处理这个 fragment :

CustomKeyboardService service =
((CustomKeyboardService.LocalBinder) binder).getService();

因为我要扩展 InputMethodService , 它已经抽象出 IBinder , 我怎样才能获得 LocalBinder让这段代码运行?目前,此代码段抛出以下异常:

java.lang.ClassCastException: android.inputmethodservice.IInputMethodWrapper cannot be cast to com.osrc.zdar.customkeyboard.CustomKeyboardService$LocalBinder

扩展类如下所示:

public class CustomKeyboardService extends InputMethodService {

// Some keyboard related stuff

public class LocalBinder extends Binder {

public CustomKeyboardService getService() {
// Return this instance of LocalService so clients can call public methods.
return CustomKeyboardService.this;
}
}

// Some keyboard related stuff

}

我如何扩展我的自定义类使得 CustomKeyboardService service
= ((CustomKeyboardService.LocalBinder) binder).getService();
不返回错误?

这是我的测试用例代码:

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest2 {
@Rule
public final ServiceTestRule mServiceRule = new ServiceTestRule();

@Test
public void testWithBoundService() throws TimeoutException {
// Create the service Intent.
Intent serviceIntent =
new Intent(InstrumentationRegistry.getTargetContext(), CustomKeyboardService.class);

// Bind the service and grab a reference to the binder.
IBinder binder = mServiceRule.bindService(serviceIntent);

// Get the reference to the service, or you can call public methods on the binder directly.
// This Line throws the error
CustomKeyboardService service =
((CustomKeyboardService.LocalBinder) binder).getService();
}

}

您还可以查看 OimeKeyboard在 Github 上获取完整的源代码,并提交带有有效仪器测试用例的 PR。

最佳答案

同样的问题发生在我身上,请查看下面链接的解决方案。
更新了链接中的代码 fragment :

@Rule
public final ServiceTestRule mServiceRule = new ServiceTestRule();

private MyKeyboard retrieveMyKeyboardInstance(IBinder binder) {
try {
Class wrapperClass = Class.forName("android.inputmethodservice.IInputMethodWrapper");
Field mTargetField = wrapperClass.getDeclaredField("mTarget");
mTargetField.setAccessible(true);

WeakReference<MyKeyboard> weakReference = (WeakReference<MyKeyboard>) mTargetField.get(binder);
return weakReference.get();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

public void validateEditTextWithKeyboardInput() throws TimeoutException {
...
Intent serviceIntent = new Intent(InstrumentationRegistry.getTargetContext(), MyKeyboard.class);
IBinder binder = mServiceRule.bindService(serviceIntent);
MyKeyboard keyboard = retrieveMyKeyboardInstance(binder);

...
}

发件人:https://github.com/sealor/prototype-Android-Espresso-Keyboard-Testing

关于android - InputMethodService 的仪器测试用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50323270/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com