当前位置: 首页 > 知识库问答 >
问题:

在JUnit测试类中使用@Autowired会引发NullPointerException吗?

饶元章
2023-03-14

我正在使用autowiring(@Autowired)在JUnit测试类中注入依赖项,并面临NullPointerException。我想知道在JUnit测试类中是否可以进行自动布线。否则,应该如何在测试类中注入bean。我的代码如下-

主类/客户端-自动布线按预期工作。

package com.example.demo;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import com.example.demo.services.IMessage;
import com.example.demo.services.SayWelcomeService;
@SpringBootApplication
@ComponentScan("com.example.demo.services")
public class AutowireWithMultipleImplementationsApplication {
    @Autowired
    IMessage sayHelloService;

    @Autowired
    SayWelcomeService sayWelcome;

    @Autowired
    IMessage masterService;

    public static void main(String[] args) {
        SpringApplication.run(AutowireWithMultipleImplementationsApplication.class, args);
    }

    @PostConstruct
    public void init() {
        String message;
        message=masterService.message("George");
        System.out.println("message: \n" + message); 

        message=sayWelcome.message("george");
        System.out.println("message: " + message);      
    }
}

服务接口和实现类接口IMessage

package com.example.demo.services;
public interface IMessage {
    String message(String name);
}

服务台:欢迎光临服务台

package com.example.demo.services;

import org.springframework.stereotype.Service;

@Service
public class SayWelcomeService implements IMessage {

    @Override
    public String message(String name) {
        return "Welcome Dear User - " + name ;
    }
}

服务SayHelloService

package com.example.demo.services;

import org.springframework.stereotype.Service;

@Service
public class SayHelloService implements IMessage {

    @Override
    public String message(String name) {
        return "Hello Dear User - " + name ;
    }
}

主服务调用其他服务。自动装配按预期工作。
MasterService

package com.example.demo.services;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MasterService implements IMessage  {

    @Autowired
    List<IMessage> listOfServices;

    @Autowired
    IMessage sayHelloService;

    @Autowired
    SayWelcomeService sayWelcome;

    @Override
    public String message(String name) {

        StringBuilder messages = new StringBuilder();
        for(IMessage m: listOfServices)
        {
            messages.append(m.message(name));
            messages.append("\n");
        }

        System.out.println(".....");
        System.out.println(sayHelloService.message(name));
        System.out.println(sayWelcome.message(name));

        return messages.toString();
    }    
}

现在是测试课<欢迎测试

package com.example.demo.tests;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;

import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.example.demo.services.SayWelcomeService;

public class SayWelcomeServiceTest {

    @Autowired
    SayWelcomeService sayWelcomeService;

    @Test
    public void testSayWelcomeMessage()
    {
        String message = sayWelcomeService.message("George");
        assertThat(message, equalTo("Welcome Dear User - George"));
    }    
}

问题在上面的课上@自动连线字段(sayWelcomeService)为空。为什么?如何解决这个问题?

共有1个答案

公羊招
2023-03-14

连接bean还需要另外两个注释。它们是强制性的,否则测试将失败。

以下是工作测试课程:

    @SpringBootTest
    @RunWith(SpringRunner.class)
    public class SayWelcomeServiceTest {

    @Autowired
    private SayWelcomeService sayWelcomeService;

    @Test
    public void testSayWelcomeMessage()
    {
        String message = sayWelcomeService.message("George");
        assertThat(message, equalTo("Welcome Dear User - George"));
    }    
}

Spring Boot Docs中的更多信息:

Spring Boot提供了一个@SpringBootTest注释,当您需要Spring Boot功能时,它可以用作标准spring-test@ContextConfiguration注释的替代方案。该注释通过SpringApplication创建测试中使用的Application Context来工作。

 类似资料:
  • 问题内容: 我已经使用过JUnit,但是某些测试存在一些问题,这些测试在Spring bean内具有@Autowired批注,当我引用它们时,@ Autowired的bean始终为NULL。 这是示例代码: 当调用Manager对象时,Spring会生成代理,但是当访问@Autowired parameterManager时,该对象为null,并且由于这个问题,我无法测试此方法。 知道是什么原因造

  • 我使用JUnit,但有些测试有一些问题,这些测试在Spring bean中有@Autowired注释,当我引用它们时,@Autowired的bean总是为空。

  • 我正在使用Mockito编写一个JUnit测试用例,并得到一个NullPointerException。 在我的代码中是这样的:

  • 问题内容: 我编写了一个转换器类,该类使用并将其转换为另一个类型,该类型包含指向Servlet请求的InputStream的指针。(其想法是从请求处理中抽象传入的传输协议,因此,例如,我也可以从FTP编写类似的转换器。) 现在,我正在尝试为此编写单元测试,但遇到了问题。我设法找出正确的样板来创建一个有效的Multipart HTTP请求(使用Spring类和),但是现在我在类的方法中得到了。我猜的

  • 我想问一下你的知识。一个Spring启动应用程序包含各种映射器。这些应该进行测试。要测试映射器,应该读取一个JSON文件。这个JSON文件加载在每个测试文件中。到目前为止,该功能已在每个测试类中实现,我想将功能外包给一个助手类。我尝试如下: 在测试类中,我调用助手如下: 很遗憾,我收到以下错误消息: 组织。springframework。豆。工厂UnsatifiedDependencyExcept

  • 我试着去模拟课堂,但我总是得到一个NPE。我见过当stubing方法时发布mockito-nullPointerException。在这篇文章中,他们这样解释: 我几乎可以肯定这也适用于我的问题。但我找不到解决办法。我已经试了10个小时了。 我还读了一些关于@autowired和@before的东西,显然@autowired是在@before之前创建的,这也可以解释我的NPE。 在@test vo