Java 在单元测试具有可分页参数的RestController时获取BeanInstDiationException
我正在使用SpringBoot1.5.4开发一个RESTful服务应用程序 我的资源类中的一个方法(findAll)接受Pageable参数并使用它调用服务方法。在对该方法进行单元测试时,我得到了BeanInstantiationException 这是我的资源类-Java 在单元测试具有可分页参数的RestController时获取BeanInstDiationException,java,unit-testing,spring-boot,Java,Unit Testing,Spring Boot,我正在使用SpringBoot1.5.4开发一个RESTful服务应用程序 我的资源类中的一个方法(findAll)接受Pageable参数并使用它调用服务方法。在对该方法进行单元测试时,我得到了BeanInstantiationException 这是我的资源类- @RestController @RequestMapping("/api/v1/users") public class UserResource { private final UserService userServ
@RestController
@RequestMapping("/api/v1/users")
public class UserResource {
private final UserService userService;
@Autowired
public UserResource(UserService userService) {
this.userService = userService;
}
@GetMapping("")
public ResponseEntity<List<User>> findAll(Pageable pageable) {
log.debug("REST request to get a page of Users");
Page<User> page = userService.findAll(pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/v1/users");
return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}
}
@Service
@Transactional
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Autowired
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional(readOnly = true)
public Page<User> findAll(Pageable pageable) {
return userRepository.findAll(pageable);
}
}
@RestController
@请求映射(“/api/v1/users”)
公共类用户资源{
专用最终用户服务用户服务;
@自动连线
公共用户资源(用户服务用户服务){
this.userService=userService;
}
@GetMapping(“”)
公共响应findAll(可分页){
debug(“获取用户页面的REST请求”);
Page=userService.findAll(可分页);
HttpHeaders=PaginationUtil.generatePaginationHttpHeaders(第页,“/api/v1/users”);
返回新的响应属性(page.getContent(),headers,HttpStatus.OK);
}
}
这是我的服务课-
@RestController
@RequestMapping("/api/v1/users")
public class UserResource {
private final UserService userService;
@Autowired
public UserResource(UserService userService) {
this.userService = userService;
}
@GetMapping("")
public ResponseEntity<List<User>> findAll(Pageable pageable) {
log.debug("REST request to get a page of Users");
Page<User> page = userService.findAll(pageable);
HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/v1/users");
return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
}
}
@Service
@Transactional
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
@Autowired
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional(readOnly = true)
public Page<User> findAll(Pageable pageable) {
return userRepository.findAll(pageable);
}
}
@服务
@交易的
公共类UserServiceImpl实现UserService{
私有最终用户存储库用户存储库;
@自动连线
公共UserServiceImpl(UserRepository UserRepository){
this.userRepository=userRepository;
}
@凌驾
@事务(只读=真)
公共页findAll(可分页){
返回userRepository.findAll(可分页);
}
}
这是我的测试课-
@RunWith(SpringRunner.class)
@WebMvcTest(UserResource.class)
public class UserResourceTest {
private static final ObjectMapper mapper = new ObjectMapper();
@Autowired
private MockMvc mvc;
@MockBean
private UserService userService;
private static final Long DEFAULT_ID = 1L;
private static final String DEFAULT_EMAIL = "test@test.com";
private static final String DEFAULT_FIRSTNAME = "john";
private static final String DEFAULT_LASTNAME = "doe";
private static final String DEFAULT_PASSWORD = "ABCDEFGHJIABCDEFGHJIABCDEFGHJIABCDEFGHJIABCDEFGHJIABCDEFGHJI";
private static final UserStatus DEFAULT_STATUS = UserStatus.ACTIVE;
private static final String DEFAULT_PHONE = "12345679";
public static User createUserWithOutId() {
User user = new User();
user.setEmail(DEFAULT_EMAIL);
user.setFirstName(DEFAULT_FIRSTNAME);
user.setLastName(DEFAULT_LASTNAME);
user.setPassword(DEFAULT_PASSWORD);
user.setStatus(DEFAULT_STATUS);
user.setPhone(DEFAULT_PHONE);
return user;
}
public static User createUserWithId() {
User user = createUserWithOutId();
user.setId(DEFAULT_ID);
return user;
}
@Test
public void findAll_WhenUsersExist_ShouldReturnUsersList() throws Exception {
final User user = createUserWithId();
List<User> users = Arrays.asList(user);
Page<User> page = new PageImpl<>(users, new PageRequest(0, 10), users.size());
when(userService.findAll(any(PageRequest.class)))
.thenReturn(page);
mvc.perform(get("/api/v1/users").accept(MediaType.APPLICATION_JSON_VALUE))
.andExpect(status().isOk());
}
}
@RunWith(SpringRunner.class)
@WebMvcTest(UserResource.class)
公共类UserResourceTest{
私有静态最终ObjectMapper mapper=新ObjectMapper();
@自动连线
私有MockMvc;
@蚕豆
私人用户服务;
专用静态最终长默认值_ID=1L;
私有静态最终字符串默认值\u电子邮件=”test@test.com";
私有静态最终字符串默认值\u FIRSTNAME=“john”;
私有静态最终字符串默认值\u LASTNAME=“doe”;
私有静态最终字符串默认值\u PASSWORD=“abcdefghjiabcdefghjiabcdefghjiabcdefghjiabcdefghjiabcdefghjiabcdefghjiabdefghji”;
private static final UserStatus DEFAULT_STATUS=UserStatus.ACTIVE;
私有静态最终字符串默认值_PHONE=“12345679”;
公共静态用户createUserWithOutId(){
用户=新用户();
user.setEmail(默认电子邮件);
user.setFirstName(默认的\u FIRSTNAME);
user.setLastName(默认的\u LASTNAME);
user.setPassword(默认密码);
user.setStatus(默认_状态);
user.setPhone(默认_PHONE);
返回用户;
}
公共静态用户createUserWithId(){
User=createUserWithOutId();
user.setId(默认的\u ID);
返回用户;
}
@试验
public void findAll_whenUserExist_ShouldReturnUsersList()引发异常{
最终用户=createUserWithId();
List users=Arrays.asList(user);
Page Page=new PageImpl(users,new PageRequest(0,10),users.size());
当(userService.findAll(any(PageRequest.class)))
。然后返回(第页);
perform(get(“/api/v1/users”).accept(MediaType.APPLICATION\u JSON\u VALUE))
.andExpect(status().isOk());
}
}
异常的堆栈跟踪-
Tests run: 7, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.76 sec <<< FAILURE! - in bd.com.ronnie.accountservice.web.rest.UserResourceTest
findAll_WhenUsersExist_ShouldReturnUsersList(bd.com.ronnie.accountservice.web.rest.UserResourceTest) Time elapsed: 0.041 sec <<< ERROR!
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.data.domain.Pageable]: Specified class is an interface
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:99)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:141)
at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:81)
at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:101)
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
at org.springframework.test.web.servlet.TestDispatcherServlet.service(TestDispatcherServlet.java:65)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.springframework.mock.web.MockFilterChain$ServletFilterProxy.doFilter(MockFilterChain.java:167)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.springframework.mock.web.MockFilterChain.doFilter(MockFilterChain.java:134)
at org.springframework.test.web.servlet.MockMvc.perform(MockMvc.java:155)
at bd.com.ronnie.accountservice.web.rest.UserResourceTest.findAll_WhenUsersExist_ShouldReturnUsersList(UserResourceTest.java:97)
Tests run:7,Failures:0,Errors:1,Skipped:0,经过的时间:0.76秒MockMvc.class不是由spring管理的,如果您使用@Autowired来标记该类,该字段将无法注入,因此它会告诉您“指定的类是一个接口”。下面是一个示例
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class Test {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.build();
}
}
如果它不起作用,我想
get(“/api/v1/users”)
不会创建requestAttr
的页面请求,因为接口UserResource.findAll
需要一个可分页的
get("/api/v1/users").requestAttr("pageable", new PageRequest(1,2))
MockMvc.class不是由spring管理的,如果您使用@Autowired来标记该类,则该字段不能被注入,因此它会告诉您“指定的类是一个接口”。下面是一个示例
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
@WebAppConfiguration
public class Test {
@Autowired
private WebApplicationContext context;
private MockMvc mvc;
@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.build();
}
}
如果它不起作用,我想
get(“/api/v1/users”)
不会创建requestAttr
的页面请求,因为接口UserResource.findAll
需要一个可分页的
get("/api/v1/users").requestAttr("pageable", new PageRequest(1,2))
谢谢@Tyorofurin。我试过了,但还是得到了前面提到的异常。谢谢@Tyorofurin。我试过了,但还是遇到了前面提到的异常。