Java 在单元测试具有可分页参数的RestController时获取BeanInstDiationException

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

我正在使用SpringBoot1.5.4开发一个RESTful服务应用程序

我的资源类中的一个方法(findAll)接受Pageable参数并使用它调用服务方法。在对该方法进行单元测试时,我得到了BeanInstantiationException

这是我的资源类-

@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。我试过了,但还是遇到了前面提到的异常。