gpt4 book ai didi

java - 使用 Spring 的 DomainClassConverter 功能进行单元测试

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:01 28 4
gpt4 key购买 nike

我正在尝试为 Controller 中定义的方法编写单元测试代码。方法是这样的:

@RestController
@RequestMapping("/products")
public class RestProductController {

@RequestMapping(value="/{product}/skus", produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
public List<SkuSummaryVO> getSkuByProduct(@Valid @PathVariable Product product){
List<SkuSummaryVO> skusByProductVOs = skuService.getSkusByProduct(product);
return skusByProductVOs;
}
}

我们在配置类中使用注释@EnableSpringDataWebSupport 来启用 D​​omainClassConverter 功能。所以我们可以将 JPA 实体用作 @PathVariable。因此,当在 URL 中设置产品 ID 时,我们将获得产品(在后台请求)。

我们在不启用 Spring App Context 和使用 Mockito 的情况下开发单元测试。所以我们像这样初始化 mockMvcBuilders:

public class RestProductControllerTest {

...

@Before
public void setUp() {
RestProductController restProductController = new RestProductController();
...
mockMvc = MockMvcBuilders.standaloneSetup(restProductController).build();
}
}

测试方法是这样的:

    @Test
public void testGetProductById() throws Exception {
...
String jsonResult = ...;
mockMvc.perform(get("/products/123/skus").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andExpect(content().string(jsonResult));
}

我得到了 500 的 HttpCode(状态)

并且单元测试对于不使用 DomainClassConverter 功能的 Controller 方法工作正常(例如,如果我使用 Long productId 而不是 Product product 作为getSkuByProduct 的参数,它会起作用)

最佳答案

更新:转念一想,我最初在下面提出的建议自从 DomainClassConverter 以来就永远行不通了。要求您的 Spring Data Repositories 出现在 ApplicationContext 中,在您的示例中,您使用的是 StandaloneMockMvcBuilder永远不会创建 ApplicationContext包含您的 Spring 数据存储库。

在我看来,您有两个选择。

  1. 使用真实的 ApplicationContext 将您的测试转换为集成测试(如引用手册中所示,通过 @ContextConfiguration 加载)并将其传递给 MockMvcBuilders.webAppContextSetup(WebApplicationContext) .如果配置ApplicationContext包括您的 Spring Data Web 配置,您应该可以开始了。
  2. 放弃使用 DomainClassConverter在你的单元测试中,而是设置一个自定义 HandlerMethodArgumentResolver (例如, stub 或模拟)通过 StandaloneMockMvcBuilder.setCustomArgumentResolvers(HandlerMethodArgumentResolver...) .然后您的自定义解析器可以返回任何 Product您想要的实例。

您必须注册一个 DomainClassConverter 的实例与 ConversionServiceStandaloneMockMvcBuilder当您调用 MockMvcBuilders.standaloneSetup(Object...) 时创建.

SpringDataWebConfiguration.registerDomainClassConverterFor() , 你可以看到 DomainClassConverter像这样实例化(并间接注册):

DomainClassConverter<FormattingConversionService> converter =
new DomainClassConverter<FormattingConversionService>(conversionService);
converter.setApplicationContext(context);

并且您可以设置自己的FormattingConversionService通过StandaloneMockMvcBuilder.setConversionService() .参见 WebMvcConfigurationSupport.mvcConversionService()有关如何配置 ConversionService 的示例用于网络环境。

接下来的挑战是如何获得对 ApplicationContext 的引用.在内部,StandaloneMockMvcBuilder使用 StubWebApplicationContext ,但据我所知(在 Spring 4.1 之前)没有子类化就无法直接访问它 StandaloneMockMvcBuilder .

从 Spring Framework 4.1 开始,您可以实现自定义 MockMvcConfigurer (这使您可以通过其 WebApplicationContext 方法访问 beforeMockMvcCreated()

希望这些信息足以让您走上正轨!

祝你好运......

山姆

关于java - 使用 Spring 的 DomainClassConverter 功能进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26400459/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com