gpt4 book ai didi

java - 为什么在 Mockito 测试期间源代码另有说明时 protected 最终字段为空?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:58:05 24 4
gpt4 key购买 nike

我使用 Mockito 1.10.19 创建了用于测试自定义 RecyclerView 适配器的测试。 (代码已经简化以消除信息噪音,留下最简单的版本仍然有问题)

public class CustomAdapter extends RecyclerView.Adapter<CustomViewHolder> {

private final Dependency dependency;

public CustomAdapter(@NonNull Dependency dependency) {
this.dependency = dependency;
}

public void refreshData() {
dependency.refreshData();
notifyDataSetChanged();
}

@Override
public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.ingredients_item, parent, false);
return new CustomViewHolder(view);
}

@Override
public void onBindViewHolder(CustomViewHolder holder, int position) {
dependency.bind(holder, position);
}

@Override
public int getItemCount() {
return dependency.getItemsCount();
}
}

我已经向它注入(inject)了模拟依赖项,但适配器在其他方面没有受到影响。

@RunWith(MockitoJUnitRunner.class)
public class CustomAdapterTest {

private CustomAdapter adapter;
@Mock
private Dependecy dependencyMock;

@Before
public void setUp() throws Exception {
adapter = new CustomAdapter(dependencyMock);
}

@Test
public void testRefreshData() throws Exception {
adapter.refreshData();
verify(dependencyMock).refreshData();
verifyNoMoreInteractions(dependencyMock);
}
}

当运行非常简单的测试“testRefreshData()”适配器调用时 notifyDataSetChanged() .这导致 NullPointerException被抛出。

在 android.support.v7.widget.RecyclerView$AdapterDataObservable.notifyChanged(RecyclerView.java:10763)在 android.support.v7.widget.RecyclerView$Adapter.notifyDataSetChanged(RecyclerView.java:6342)

这发生在代码中:

static class AdapterDataObservable extends Observable<AdapterDataObserver> {
public boolean hasObservers() {
return !mObservers.isEmpty();
}
public void notifyChanged() {
// since onChanged() is implemented by the app, it could do anything, including
// removing itself from {@link mObservers} - and that could cause problems if
// an iterator is used on the ArrayList {@link mObservers}.
// to avoid such problems, just march thru the list in the reverse order.
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onChanged();
}
}

取消引用时 mObservers .这不应该发生,因为 Observable<T>定义 mObservers作为最终和初始化:

public abstract class Observable<T> {
/**
* The list of observers. An observer can be in the list at most
* once and will never be null.
*/
protected final ArrayList<T> mObservers = new ArrayList<T>();

为什么会这样?这是某种错误或已知限制吗?我该如何解决这个问题? (不算 Robolectric,我决定停止使用它,因为它有自己的问题)

在任何人问之前;这仅在测试期间发生,经过测试的代码工作正常。

使用的版本:JUnit 4.12。 Mockito 1.10.19,支持库 25.0.0,Android Studio 2.2.2,jdk 1.8.0_112,

最佳答案

这可能是因为您尝试使用 JUnit 测试依赖于 Android 框架类的代码。

请阅读this answer到与完全相同的问题相关的另一个问题。

关于java - 为什么在 Mockito 测试期间源代码另有说明时 protected 最终字段为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40320674/

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