Android 如何检查AppBarLayout.Behavior dragCallback是否已设置?

Android 如何检查AppBarLayout.Behavior dragCallback是否已设置?,android,unit-testing,android-coordinatorlayout,android-appbarlayout,Android,Unit Testing,Android Coordinatorlayout,Android Appbarlayout,我正在尝试单元测试是否在AppBarLayout上设置了自定义DragCallback的行为。 有一个set方法用于设置dragCallback,但没有getter方法 AppBarLayout.Behavior behavior = new AppBarLayout.Behavior(); behavior.setDragCallback(new AppBarLayoutCustomCallback()); 是否有任何方法可以访问appbarlayout.behavior的dragCallb

我正在尝试单元测试是否在AppBarLayout上设置了自定义DragCallback的行为。 有一个set方法用于设置dragCallback,但没有getter方法

AppBarLayout.Behavior behavior = new AppBarLayout.Behavior();
behavior.setDragCallback(new AppBarLayoutCustomCallback());

是否有任何方法可以访问appbarlayout.behavior的dragCallback?

您可以使用反射来获取appbarlayout的
dragCallback
字段表单行为。该字段是私有的,getter不可用,可能是为了不扭曲行为

  private AppBarLayout.Behavior.DragCallback getDragCallback(AppBarLayout appBarLayout){
        CoordinatorLayout.LayoutParams layoutParams = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
        CoordinatorLayout.Behavior behavior = layoutParams.getBehavior();
        if(behavior != null){
            try {
                Field mDragCallbackField = behavior.getClass().getDeclaredField("mDragCallback");
                mDragCallbackField.setAccessible(true);
                AppBarLayout.Behavior.DragCallback dragCallback = (AppBarLayout.Behavior.DragCallback) mDragCallbackField.get(behavior);
                return dragCallback;
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }

        return null;
    }

然后只需
assertNotNull(getDragCallback(mAppBarLayout))

我最终分解了行为的创建,并进行了单元测试,并验证了setDragCallBack是通过我的自定义行为回调调用的

protected AppBarLayout.Behavior createBehaviorWithCallBack(AppBarLayout.Behavior behavior) {
    behavior.setDragCallback(new MyCustomCallback());
    return behavior;
}
对于单元测试

assertNotNull(behavior);
verify(behavior).setDragCallback(any(MyCustomCallback.class));