将@RunWith(PowerMockrunner.class)添加到测试中可以进行所有其他测试NPE

时间:2019-06-07 16:26:55

标签: android mockito powermock powermockito

我有一个运行Mockito测试的测试类,例如:

public class ViewModelTest {

    @Before
    public void setUp() throws Exception {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void openQuestion() {
        viewModel.openQuestion(context, QUESTION_ID);
        verify(questionRouter).open(context, QUESTION_ID);    //just an example
    }

}

一切正常。但是,我必须在一个测试类中模拟一个静态方法,因此我将PowerMock添加到我的类中:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Uri.class)
public class ViewModelTest { ...

和依赖项:

testImplementation 'org.powermock:powermock-core:2.0.2'
testImplementation 'org.powermock:powermock-api-mockito2:2.0.2'
testImplementation 'org.powermock:powermock-module-junit4-rule-agent:2.0.2'
testImplementation 'org.powermock:powermock-module-junit4-rule:2.0.2'
testImplementation 'org.powermock:powermock-module-junit4:2.0.2'

但是当我现在尝试运行测试时(假设我有15种测试方法),大多数测试方法都获得了NPE:

java.lang.NullPointerException
at com.example.Viewmodel.prepare(StartViewModel.java:126)

即使在尝试模拟静态方法的方法中,我也会获得NPE:

PowerMockito.mockStatic(Uri.class);
    PowerMockito.when(Uri.parse(anyString())).thenReturn(otherUri);

在您对NPE进行投票表决并结束投票之前,我真的查看了SO和其他网站上的大多数答案,尝试了其中的许多答案,但这些都不适合我。我遵循了Powermock的教程,但是仍然出现此错误,并且我不明白为什么。这是我尝试解决此问题的最后手段。

1 个答案:

答案 0 :(得分:0)

您以正确的方式进行测试,只需替换

PowerMockito.when(Uri.parse(anyString())).thenReturn(otherUri);

带有Mockito的时间

 Mockito.when(Uri.parse(anyString())).thenReturn(otherUri);

并将此文件https://gist.github.com/badr-ghazouan/1edbed170ce968ef0011f2721911ffc6添加到test文件夹下的资源文件夹,mockito将自动加载它,而无需执行任何操作。

希望这对您有用