Java Spring RESTful(Gradle):@自动连线导致NullPointerException

Java Spring RESTful(Gradle):@自动连线导致NullPointerException,java,spring,gradle,junit,Java,Spring,Gradle,Junit,请知道,我已经在这个网站和其他地方对这个问题进行了广泛的研究,但建议的解决方案并不适合我 我可以运行Spring应用程序本身而不会出现问题(bootRun),因此我假设这只是jUnit相关的问题。 当我尝试在SearchControllerUnitTest类上运行Gradle测试或JUnit测试时,最终得到的是NullPointerException 有人能指出我的配置不正确的地方吗 谢谢大家! SearchControllerUnitTest.java @Category(UnitTe

请知道,我已经在这个网站和其他地方对这个问题进行了广泛的研究,但建议的解决方案并不适合我

我可以运行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 {
        . . . 
    }
    @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
        }
SearchController.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 {
        . . . 
    }
    @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
        }
ProductServiceImpl.java

    public interface ProductService {
        . . .
        public Product getProduct(String productName);
        . . .
    }
    @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)

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

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

@Autowired
private SearchController controller;

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

您是否为测试上下文定义了连接?非常感谢。它成功了。我刚到春天,还在学习。:)