首页 > 解决方案 > 使用 Mockito 存根时出现 NullPointerException

问题描述

我对 Mockito 还很陌生,但是在尝试对 Texture 类进行存根时出现 NullPointerError。这是我的测试:

import com.badlogic.gdx.graphics.Texture;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.junit.MockitoJUnitRunner;
import org.testng.annotations.BeforeMethod;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
 class EntityTest {

     @InjectMocks
     public Texture mockedImg;

     @BeforeMethod
     public void setup() {
         mockedImg = mock(Texture.class);
         when(mockedImg.getWidth()).thenReturn(5);
         when(mockedImg.getHeight()).thenReturn(5);
     }

    @Test
    public void doesAnyOfMyCodeWork() {
         Assertions.assertEquals(mockedImg.getHeight(),5);
    }
}

这是我得到的错误:

java.lang.NullPointerException
    at EntityTest.doesAnyOfMyCodeWork(EntityTest.java:35) <19 internal calls>
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) <9 internal calls>
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1540) <18 internal calls>
    at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
    at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
    at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
    at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

(第 35 行是Assertions.assertEquals(mockedImg.getHeight(),5);

任何帮助将非常感激!

标签: javajunitnullpointerexceptionmockito

解决方案


所以我现在的代码似乎如下所示:

import com.badlogic.gdx.graphics.Texture;
import org.junit.Before;
import org.junit.Test;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.ValueSource;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;

import static org.mockito.Mockito.*;


@RunWith(MockitoJUnitRunner.class)
public class EntityTest {

     @Mock
     public Texture mockedImg;

     @Before
     public void setup() {
         mockedImg = mock(Texture.class);
         lenient().when(mockedImg.getWidth()).thenReturn(5);
         lenient().when(mockedImg.getHeight()).thenReturn(5);
     }


     @Test
     public void doesAnyOfMyCodeWork() {
         Assertions.assertEquals(mockedImg.getHeight(),5);
     }
}

这真的很奇怪,因为我昨天有几乎完全相同的代码并且它引发了一大堆错误(尽管我已经将我的测试移到了可能有帮助的不同源文件夹)。感谢您帮助我解决这些问题。


推荐阅读