【问题标题】:Android :cannot unit test android functions receiving NPEAndroid:无法对接收 NPE 的 android 函数进行单元测试
【发布时间】:2017-06-10 15:25:42
【问题描述】:

我刚刚开始在 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(Null Pointer Exception)?我已经读过 power mockito 用于对最终方法进行单元测试,但它似乎不是最终方法的单元测试 notifyDataSetChanged。任何帮助将不胜感激。

【问题讨论】:

    标签: android unit-testing mockito powermockito


    【解决方案1】:

    符合 Android 文档 - “如果您的单元测试对 Android 没有依赖关系或仅具有简单依赖关系,则应在本地开发机器上运行测试”

    Mockito/PowerMockito 在您的 JVM 上运行。

    @InjectMocks
    Activity activity;
    

    模拟活动并不是直接的,这就是我们有仪器化单元测试的原因。我在上面的测试用例中看到了很多问题。我认为您应该在您的案例中编写仪器案例。

    在您拥有更多 Java 对象的地方使用 Mockito/PowerMockito,例如您的表示类(在 MVP 架构中)或任何业务逻辑。

    请查看有关测试here 的android 文档。 这将使您正确了解在 Android 中编写单元测试用例的方式和方法。

    【讨论】:

      【解决方案2】:

      使用 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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        • 1970-01-01
        • 2022-11-17
        相关资源
        最近更新 更多