Android:无法单元测试接收NPE的android功能

时间:2017-06-10 15:25:43

标签: android unit-testing mockito powermockito

我刚开始在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这是最终方法。任何帮助将不胜感激。

2 个答案:

答案 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

之后,您应该能够模拟最终的类或方法。我遇到了同样的问题,这对我有用。