【问题标题】:Spring RESTful (Gradle) : @Autowired results in NullPointerExceptionSpring RESTful (Gradle):@Autowired 导致 NullPointerException
【发布时间】:2024-10-06 13:50:01
【问题描述】:

请注意,我已在本网站和其他地方广泛研究过这个问题,但建议的解决方案对我不起作用。

我可以毫无问题地运行 Spring 应用程序本身(bootRun),因此我认为这只是与 jUnit 相关的问题。 当我尝试在 SearchControllerUnitTest 类上运行 Gradle 测试或 JUnit 测试时,我最终得到 NullPointerException。

谁能指出我的配置不正确的地方?

谢谢!

SearchControllerUnitTest.java

    @Category(UnitTest.class)
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = AppConfig.class)
    public class SearchControllerUnitTest extends UnitTest {

        private MockMvc mockMvc;

        @Override
        @Before
        public void setUp() {
            super.setUp();
            mockMvc = MockMvcBuilders.standaloneSetup(new SearchController()).build();
        }

    @Test
    public void getProductTest() throws Exception {
        . . . 
    }

SearchController.java

    @RestController
    public class SearchController {

        public static final Logger log = LoggerFactory.getLogger(SearchController.class);

        @Autowired
        Product product; // <<< autowiring not working in jUnit only

        @Autowired
        ProductService productService; // <<< autowiring not working in jUnit only

        @RequestMapping(value = "/search", method = RequestMethod.GET, produces = "application/json")
        public ResponseEntity<Product> getProduct(@RequestParam(value = "name", required = true) String name) {

            if (productService == null) {
                log.info("productService is null!!");
            }
            . . .

            product = productService.getProduct(name);  // <<<< NPE here
        }

ProductService.java

    public interface ProductService {
        . . .
        public Product getProduct(String productName);
        . . .
    }

ProductServiceImpl.java

    @Service
    public class ProductServiceImpl implements ProductService {

        public Product getProduct(String productName){
            . . .   
        }

    }

例外:

Caused by: java.lang.NullPointerException
    at com.somepckagename.controller.SearchController.getProduct(SearchController.java:36)

【问题讨论】:

  • 您是否为您的测试上下文定义了接线?

标签: java spring gradle junit


【解决方案1】:

您正在mockMvc = MockMvcBuilders.standaloneSetup(new SearchController()).build(); 行中自己创建 SearchController 的实例。如果你这样做,自动装配当然不会工作,因为 Spring 不知道它是一个 bean。

而是在您的测试中创建一个字段来注入控制器:

@Autowired
private SearchController controller;

并使用该实例。这也是使用构造函数注入而不是字段注入的完美理由。

【讨论】:

  • 非常感谢。它成功了。我是 Spring 新手,仍在学习。 :)