Spring RESTful (Gradle) : @Autowired results in NullPointerE



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

我可以毫无问题地运行 Spring 应用程序本身(bootRun),因此我认为这只是与 jUnit 相关的问题。当我尝试在 SearchControllerUnitTest 类上运行 Gradle test 或 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 {
        . . . 
    }

搜索控制器.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
        }

产品服务.java

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

产品服务.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)

您正在第 mockMvc = MockMvcBuilders.standaloneSetup(new SearchController()).build(); 行中自行创建 SearchController 的实例。如果你这样做,自动布线当然不会起作用,因为Spring不知道它是豆子。

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

@Autowired
private SearchController controller;

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

最新更新