测试使用PersistentEntityResourceAssembler的自定义RepositoryRestController

时间:2017-10-10 03:50:01

标签: java spring spring-data-jpa spring-test spring-rest

我有RepositoryRestController公开某些持久性实体的资源。

我的控制器上有一个方法,它使用PersistentEntityResourceAssembler来帮助我自动生成资源。

@RepositoryRestController
@ExposesResourceFor(Customer.class)
@RequestMapping("/api/customers")
public class CustomerController {

    @Autowired
    private CustomerService service;

    @RequestMapping(method = GET, value="current")
    public ResponseEntity getCurrent(Principal principal Long id, PersistentEntityResourceAssembler assembler) {
        return ResponseEntity.ok(assembler.toResource(service.getForPrincipal(principal)));
    }
}

(已举例说明,但它可以节省关于我的用例的无关细节的详细信息)

我想为我的控制器编写一个测试(我的实际用例实际上值得测试),并计划使用@WebMvcTest。

所以我有以下测试类:

@RunWith(SpringRunner.class)
@WebMvcTest(CustomerController.class)
@AutoConfigureMockMvc(secure=false)
public class CustomerControllerTest {
    @Autowired
    private MockMvc client;

    @MockBean
    private CustomerService service;

    @Test
    public void testSomething() {
        // test stuff in here
    }

    @Configuration
    @Import(CustomerController.class)
    static class Config {
    }

}

但我得到一个例外java.lang.NoSuchMethodException: org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler.<init>()

据推测,这里没有正确配置某些内容,因为我错过了整个数据层。有没有办法模仿PersistentEntityResourceAssembler?或者我可以在这里使用另一种方法?

2 个答案:

答案 0 :(得分:3)

我现在结束了:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc

它的缩减是测试将启动完整的Spring应用程序上下文(但没有服务器)。

答案 1 :(得分:0)

我最终在这里做了一个有点讨厌的解决方案:

  • 我从控制器方法中删除了PersistentEntityResourceAssembler
  • 我在控制器中添加了@Autowired RepositoryEntityLinks,我在其上调用linkToSingleResource以根据需要创建链接。
  • 我在我的测试类中添加了@MockBean RepositoryEntityLinks,并将模拟配置为返回合理的内容:

    given(repositoryEntityLinks.linkToSingleResource(any(Identifiable.class)))
            .willAnswer(invocation -> {
                final Identifiable identifiable = (Identifiable) invocation.getArguments()[0];
                return new Link("/data/entity/" + identifiable.getId().toString());
            });
    

它远非理想 - 我很想知道是否有足够的数据层可以依赖PersistentEntityResourceAssembler