使用数据绑定进行 Android 单元测试

Kar*_*oly 5 data-binding android unit-testing

我现在正在做一个非常好的项目,我们在其中引入了 Android 数据绑定。代码中一切正常,绑定完美,但是当涉及到单元测试时,我无法测试我的代码。我正在努力模拟数据绑定......

将此行添加到setUp()方法时:

PowerMockito.when(DataBindingUtil.class, "inflate", inflater,anyInt(),any(ViewGroup.class),anyBoolean()).thenReturn(viewDataBinding.getRoot());

我将收到以下错误消息:

...thenReturn() 可能会丢失。

正如你所看到的,我在最后有 thenReturn,但 Mockito 没有看到它。

我试图将代码移动到一个具体的测试方法中:

  @Test
public void createViewHolder() {
  .... CODE....
 when(DataBindingUtil.inflate(inflater,anyInt(),any(ViewGroup.class),anyBoolean())).thenReturn(viewDataBinding);
... CODE ...}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我将收到以下消息:

org.mockito.exceptions.misusing.WrongTypeOfReturnValue: ViewDataBinding$$EnhancerByMockitoWithCGLIB$$f5f40ad1 不能被 inflate() 返回 inflate() 应该返回 View

我不明白为什么我会收到这条消息,因为 DataBindingUtil.inflate 在代码中返回一个 ViewDataBinding,它在那里完美地工作。你们有没有试过在 Android 上模拟和单元测试数据绑定?

Kar*_*oly 2

好的,问题如下:需要添加:

@PrepareForTest({DataBindingUtil.class}) 到类的开头

PowerMockito.mockStatic(DataBindingUtil.class);
PowerMockito.mockStatic(ViewDataBinding.class);
Run Code Online (Sandbox Code Playgroud)

我必须将这些行添加到 setUp();

然后:

when(DataBindingUtil.inflate(eq(inflater), anyInt(), any(ViewGroup.class), anyBoolean())).thenReturn(viewDataBinding);
when(viewDataBinding.getRoot()).thenReturn(itemView);
Run Code Online (Sandbox Code Playgroud)

进入测试本身。