Spring MVC 测试失败
Spring MVC Test failing
我正在尝试 运行 Spring MVC 测试,但一直收到此异常。
org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.NullPointerException
异常发生是因为自动装配依赖,
@Autowired
private AccountService accountService;
未在测试中注入(在测试外工作正常)。
谁能帮我解决这个问题。这是我的代码:
//AccountControllerITestClass
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MockServletContext.class)
@WebAppConfiguration
public class AccountControllerITest {
private MockMvc mvc;
ObjectMapper om;
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new AccountController()).build();
}
@Test
public void getAccounts() throws Exception {
MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get("/api/accounts"))
.andExpect(status().isOk())
.andReturn();
}
}
}
//账户控制器
@RestController
@RequestMapping("/api/accounts")
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<Set<AccountInfo>> getAccounts(@RequestParam(value = "firstName", required = false) String firstName,
@RequestParam(value = "surName", required = false) String surName) {
Set<AccountInfo> accounts = accountService.getAccounts(firstName, surName);
return new ResponseEntity<>(accounts, HttpStatus.OK);
}
}
感谢您的帮助!
因为您使用的是独立设置:mvc = MockMvcBuilders.standaloneSetup(new AccountController()).build();
。如果您通过 new AccountController()
创建控制器,Spring 没有机会注入 accountService
,因为它不控制实例的创建和连接。
您有两个选择:
将您的测试切换为单元测试并且不要在以下位置使用 SpringJUnit4ClassRunner
或 MockServletContext
全部。您可以使用 @InjectMocks
注入 private accountService
:
public class AccountControllerITest {
private MockMvc mvc;
ObjectMapper om;
@Mock
private AccountController accountController = new AccountController();
@InjectMocks
private AccountService accountService = new Mockito.mock(AccountService.class);
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(accountController).build();
}
您还可以将增强功能应用于您的控制器。将字段注入替换为构造函数注入,您可以在测试中通过构造函数将 accountService
传递给控制器。这样你根本不需要使用 @InjectMocks
。
使用 webAppContext 设置:
@Autowired
private WebApplicationContext webApplicationContext;
@BeforeMethod
public void init() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
您需要配置测试以注入自动装配的属性。请参阅以下代码块:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class AccountControllerITest {
// ... your test code
@Configuration
public static class YourConfiguration {
@Bean
AccountService accountService() {
// init and return your AccountService
}
}
}
您可以使用 Mockito 初始化您的 AccountService
。
我正在尝试 运行 Spring MVC 测试,但一直收到此异常。
org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 java.lang.NullPointerException
异常发生是因为自动装配依赖,
@Autowired
private AccountService accountService;
未在测试中注入(在测试外工作正常)。
谁能帮我解决这个问题。这是我的代码:
//AccountControllerITestClass
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MockServletContext.class)
@WebAppConfiguration
public class AccountControllerITest {
private MockMvc mvc;
ObjectMapper om;
@Before
public void setUp() throws Exception {
mvc = MockMvcBuilders.standaloneSetup(new AccountController()).build();
}
@Test
public void getAccounts() throws Exception {
MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get("/api/accounts"))
.andExpect(status().isOk())
.andReturn();
}
}
}
//账户控制器
@RestController
@RequestMapping("/api/accounts")
public class AccountController {
@Autowired
private AccountService accountService;
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<Set<AccountInfo>> getAccounts(@RequestParam(value = "firstName", required = false) String firstName,
@RequestParam(value = "surName", required = false) String surName) {
Set<AccountInfo> accounts = accountService.getAccounts(firstName, surName);
return new ResponseEntity<>(accounts, HttpStatus.OK);
}
}
感谢您的帮助!
因为您使用的是独立设置:mvc = MockMvcBuilders.standaloneSetup(new AccountController()).build();
。如果您通过 new AccountController()
创建控制器,Spring 没有机会注入 accountService
,因为它不控制实例的创建和连接。
您有两个选择:
将您的测试切换为单元测试并且不要在以下位置使用
SpringJUnit4ClassRunner
或MockServletContext
全部。您可以使用@InjectMocks
注入 privateaccountService
:public class AccountControllerITest { private MockMvc mvc; ObjectMapper om; @Mock private AccountController accountController = new AccountController(); @InjectMocks private AccountService accountService = new Mockito.mock(AccountService.class); @Before public void setUp() throws Exception { mvc = MockMvcBuilders.standaloneSetup(accountController).build(); }
您还可以将增强功能应用于您的控制器。将字段注入替换为构造函数注入,您可以在测试中通过构造函数将
accountService
传递给控制器。这样你根本不需要使用@InjectMocks
。使用 webAppContext 设置:
@Autowired private WebApplicationContext webApplicationContext; @BeforeMethod public void init() { mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); }
您需要配置测试以注入自动装配的属性。请参阅以下代码块:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class AccountControllerITest {
// ... your test code
@Configuration
public static class YourConfiguration {
@Bean
AccountService accountService() {
// init and return your AccountService
}
}
}
您可以使用 Mockito 初始化您的 AccountService
。