Я пытаюсь закодировать единичный тест для метода, определенного в контроллере. Метод таков:Тестирование модуля с использованием функции DomainClassConverter Spring
@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;
}
}
Мы используем в нашем классе Configuration аннотаций @EnableSpringDataWebSupport, чтобы включить функцию DomainClassConverter. Таким образом, мы можем использовать объект JPA как @PathVariable. Поэтому, когда идентификатор продукта будет указан в URL-адресе, мы получим продукт (с запросом за сценой).
Мы разрабатываем единичный тест без включения контекста приложения Spring и использования 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 (например, если я использую Long productId
вместо Product product
в качестве параметра getSkuByProduct
, он будет работать)
мы изменили код, и мы не используем DomainClassConverter anymore.we имеют отношение '@ ManyToOne' к' Product' от 'Sku' лица и мы только что обнаружили, что в Spring data JPA мы можем получить доступ к продукту только с идентификатором (а не с полным объектом продукта, поэтому не более «DomainClassConverter»), используя специальные ключевые слова для имени метода: 'findByProductId' в нашем интерфейсе репозитория (witch extends JpaRepository). С помощью «DomainClassConverter» используемым методом был «findByProduct». В документе doc данных Spring они говорят о имени ключевых слов метода, но его не ясно, когда мы имеем отношение между объектами. –
Но в противном случае мы пошли бы к вашему методу 1. Но спасибо за ваш четкий ответ. –
Вы очень желанны. И я рад, что вы нашли более чистое решение с подходом 'findByProductId()'! –