当前位置: 首页 > 知识库问答 >
问题:

使用可分页参数对RestController进行单元测试时获取BeanInstationException

越飞翮
2023-03-14

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

我的资源类中的一个方法(findAll)接受Pagable参数,并使用它来调用服务方法。在单元测试此方法时,我得到了BeanInstantiationExcema。

这是我的资源课-

@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);
    }
}

这是我的测试课-

@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());
    }
}

异常的堆栈跟踪-

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)

共有1个答案

夏兴平
2023-03-14

MockMvc。类不是由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))
 类似资料:
  • 最近,我尝试为akka参与者编写一些单元测试,以测试参与者消息流。我在测试中观察到一些奇怪的行为: 下一个 在我的代码中,我有: 基本上,有时(很少)这样的测试失败(在另一个操作系统上),并且抛出processMessage方法的异常(由于业务逻辑导致的IllegalStateException)。

  • 我有一个单元测试,正在检查几个不同服务的控制器构造函数的空异常。 在我的控制器构造函数中,我有: 我对每个都有一个单元测试,但是我如何区分两者。我可以保留测试,因为任何一个检查都可能抛出null,所以我想通过参数名测试异常。 这可能吗?

  • 我正在根目录下的test文件夹中使用Jest单元测试,并尝试在多个分支上对节点进行单元测试。Are项目设置在git存储库中。当我的团队完成一个分支后,他们会将其与master合并。通常,如果我使用代码,我会在master上工作,但我想在它们的分支上做一些事情。通常,如果代码不完整,我不会接触其他分支,但由于这是为了单元测试他们的代码,而不是开发代码,我认为查看他们在分支1和分支2上的最新提交是可以

  • 我有这样一个简单的课程: 我想为它写一个测试,下面是一个框架: ErrorLogger类中的logger是由StaticLoggerBinder提供的,所以我的问题是-如何让它工作,以便那些检查“1*logger.error(u作为字符串)”可以工作?在ErrorLogger类中,我找不到一种恰当的方式来嘲笑那个记录器。我曾考虑过反射,并以某种方式访问它,此外,mockito注入也有一个想法(但如

  • 我有一个请求表单的映射: 现在我想用MockMvcBuilders为此编写一个测试。不过,我不能这样做。 这里的挑战是请求处理程序需要使用Multipart/form-data,它由4个Multipart Files和1个Json数据组成。 有没有办法解决这个问题?请记住,我必须使用Spring 4.3。 如果您需要更多信息,请告诉我。

  • 目前正在搜索教程、解释和示例。我试过不同的例子,遇到了不同的错误。我当前的错误是: |错误编译错误编译[单元]测试:启动失败: 在我的测试报告中。它输出: 单元测试结果-摘要未执行测试。 我的“用户pec.groovy”代码是这样的: 有人能帮忙吗。我是圣杯新手。谢谢 除上述问题外,当我在课堂上省略了如下所示的禁忌: 我发现了这个错误: |运行1单元测试...1 of 1|失败:初始化错误(org