使用Spring Boot进行测试会引发空指针异常

时间:2018-07-17 17:17:27

标签: java spring spring-boot spring-boot-test

我是Spring Boot的新手,我正在尝试测试一个非常简单的课程。但是,当我在下面运行testMe()时,却在下面出现异常

java.lang.NullPointerException
    at MyTest.testMe(MyTest.java:25)
    at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
    at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)

我的理解是,在加载上下文时,将初始化所有bean,并创建对象HelloWorld并在MyTest调用中自动装配它们。但是helloWorld对象是nullhelloWorld.printHelloWorld();

在这里我需要帮助以了解缺少的内容。

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest(classes = {AppConfigTest.class})
public class MyTest {

    @Mock
    @Autowired
    private Message myMessage;

    @Autowired
    private HelloWorld helloWorld;

    @Test
    public void testMe(){
       helloWorld.printHelloWorld();
    }
}


@Configuration
public class AppConfigTest {

   @Bean
    public HelloWorld helloWorld() {
        return new HelloWorldImpl();
    }

    @Bean
    public Message getMessage(){
        return new Message("Hello");
    }
}

public interface HelloWorld {
    void printHelloWorld();
}

public class HelloWorldImpl implements HelloWorld {

    @Autowired
    Message myMessage;

    @Override
    public void printHelloWorld() {
        System.out.println("Hello : " + myMessage.msg);
    }

}

public class Message {

    String msg;

    Message(String message){
        this.msg = message;
    }
}

1 个答案:

答案 0 :(得分:2)

您正在使用不具备Spring意识的运行器来运行测试,因此没有接线。看一下Spring Boot testing documentation,他们所有的示例都使用@RunWith(SpringRunner.class)。要模拟bean,请使用@MockBean而不是@Mock对其进行注释。确保spring-boot-starter-test包含在您的POM中。