Java Spring RESTful(Gradle):@自动连线导致NullPointerException
请知道,我已经在这个网站和其他地方对这个问题进行了广泛的研究,但建议的解决方案并不适合我 我可以运行Spring应用程序本身而不会出现问题(bootRun),因此我假设这只是jUnit相关的问题。 当我尝试在SearchControllerUnitTest类上运行Gradle测试或JUnit测试时,最终得到的是NullPointerException 有人能指出我的配置不正确的地方吗 谢谢大家! SearchControllerUnitTest.javaJava Spring RESTful(Gradle):@自动连线导致NullPointerException,java,spring,gradle,junit,Java,Spring,Gradle,Junit,请知道,我已经在这个网站和其他地方对这个问题进行了广泛的研究,但建议的解决方案并不适合我 我可以运行Spring应用程序本身而不会出现问题(bootRun),因此我假设这只是jUnit相关的问题。 当我尝试在SearchControllerUnitTest类上运行Gradle测试或JUnit测试时,最终得到的是NullPointerException 有人能指出我的配置不正确的地方吗 谢谢大家! SearchControllerUnitTest.java @Category(UnitTe
@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;
并使用该实例。这也是使用构造函数注入而不是字段注入的完美理由。您是否为测试上下文定义了连接?非常感谢。它成功了。我刚到春天,还在学习。:)