我刚开始在android中进行单元测试。我不能单元测试android内部方法来通知数据被更改(notifyDataSetChanged),我在这一点上得到空指针异常。我正在使用mockito和power moockito来模拟不同的物体。
public void RecyclerView(String value,Bitmap image) {
RecyclerViewAdapter adapter = new RecyclerViewAdapter(MainActivity.this);
recyclerView.setAdapter(adapter);// set adapter on recyclerview
adapter.notifyDataSetChanged();// Notify the adapter
}
我的单元测试是:
@RunWith(PowerMockRunner.class)
@PrepareForTest({MainActivity.class})
public class MainActivityTest {
@Mock
Bitmap bitmap;
@Mock
RecyclerView recycleview;
@InjectMocks
Activity activity;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mainactivity = new MainActivity();
}
@Test
public void PopulateRecyleViewTest() {
try {
final RecyclerViewAdapter abc = PowerMockito.mock(RecyclerViewAdapter.class);
PowerMockito.whenNew(RecyclerViewAdapter.class).withArguments(mainactivity).thenReturn(abc);
doNothing().when(abc).notifyDataSetChanged(); //do nothing getting exception here
mainactivity.recyclerView = recycleview;
mainactivity.PopulateRecyleView("", bitmap);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
有没有办法对这个方法进行单元测试,以便notifydatasetchanged()不会给出NPE(空指针异常)?我已经读过power mockito用于单元测试最终方法,但它似乎不是单元测试notifyDataSetChanged这是最终方法。任何帮助将不胜感激。
答案 0 :(得分:0)
适用于Android文档 - "如果您的单元测试没有依赖关系或只有Android上的简单依赖关系,您应该在本地开发计算机上运行测试"
Mockito / PowerMockito在您的JVM上运行。
@InjectMocks
Activity activity;
嘲笑我们进行仪器化单元测试的活动并不是直截了当的。我在上面的测试用例中看到了很多问题。我认为你应该在你的案例中编写仪表案例。
使用Mockito / PowerMockito,您可以在其中拥有更多Java对象,例如演示类(在MVP架构中)或任何业务逻辑。
请检查有关测试here的Android文档。 这将为您提供正确的图片,说明在Android中编写单元测试用例的方法和方法。
答案 1 :(得分:0)
在Mockito 2.0及更高版本中,您可以通过添加文件来模拟最终的类和方法。请查看此文档:Mock the unmockable: opt-in mocking of final classes/methods
基本上,它指出您必须创建文件src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
,然后添加单行:
mock-maker-inline
之后,您应该能够模拟最终的类或方法。我遇到了同样的问题,这对我有用。