Mockito在android上抛出lang异常

时间:2015-11-27 00:14:54

标签: mockito android-testing

我正在学习谷歌在其Android代码中使用的MVP架构。我已经建立了一个简单的例子。两个输入字段和一个" +"按钮显示添加结果。视图是主要活动,我有一个调用服务来添加两个输入值的演示者。视图将自身传递给onCreate方法中的演示者,并保留演示者的引用。

查看界面:

public interface MainView {

    String getFirstInput();

    void showFirstInputError(int resId);

    String getSecondInput();

    void showSecondInputError(int resId);

    void setResultText(int result);
}

按下按钮时调用的Presenter方法:

public void onResultClicked(){
        String firstInput = view.getFirstInput();
        String secondInput = view.getSecondInput();

        if(firstInput.isEmpty()) {
            view.showFirstInputError(R.string.num_input_error);
            return;
        }

        if(secondInput.isEmpty()) {
            view.showSecondInputError(R.string.num_input_error);
            return;
        }

        Service service = new Service();

        int result = service.add(Integer.getInteger(firstInput),
                Integer.getInteger(secondInput));

        view.setResultText(result);

    }

测试:

@Test
    public void shouldPopulateResultWhenButtonIsClicked() throws Exception {
        when(view.getFirstInput()).thenReturn("3");
        when(view.getSecondInput()).thenReturn("3");
        when(service.add(3,3)).thenReturn(6);
        presenter.onResultClicked();
        verify(service).add(3,3);
        verify(view).setResultText(6);
    }

我在服务尝试添加两个输入的行上收到错误。

presenter.onResultClicked();
int result = service.add(Integer.getInteger(firstInput),
                    Integer.getInteger(secondInput));

请有人帮忙。感谢。

java.lang.NullPointerException
    at com.example.ulidder.tdd_mvp_simple.MainPresenter.onResultClicked(MainPresenter.java:29)
    at com.example.ulidder.tdd_mvp_simple.MainPresenterTest.shouldPopulateResultWhenButtonIsClicked(MainPresenterTest.java:46)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74)

1 个答案:

答案 0 :(得分:0)

它与Android,Mockito或MVP没有任何关系,你正在运行jUnit测试,它是纯Java。

这只是一个NullPointerException,没有别的。转到MainPresenter.java的第29行,添加断点并在调试模式下启动测试,以查看对空引用进行的方法调用。如有必要,从链式调用中提取变量。

我怀疑service.add(...)会返回java.lang.Integer并且您将其分配给int。如果它返回null,则取消装箱将在此行获得NullPointerException。尝试将返回值分配给Integer并调试该值。它可能为空。

有关取消归零空值的详细信息,请参阅this post

希望这有帮助。