我正在為許多不同的 Spring Controller 撰寫端到端測驗。現在,我正在嘗試撰寫一個包含 MockMvc 執行方法的測驗通用類。我有需要在不同控制器中呼叫的端點,我不想復制粘貼代碼,并且在每個測驗類中都有一個 MockMvc 和 ObjectMapper。
方法的幾個例子:
public void saveMockDish(DishDto dishDto) throws Exception {
mockMvc.perform(
MockMvcRequestBuilders.post(DISH_ENDPOINT)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(dishDto)))
.andExpect(status().isCreated());
}
public DishDto getMockDish(Long id) throws Exception {
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders
.get(DISH_ENDPOINT "/{id}", id))
.andExpect(status().isOk())
.andReturn();
String contentAsString = mvcResult.getResponse().getContentAsString();
return objectMapper.readValue(contentAsString, new TypeReference<>() {
});
}
我想要完成什么(我可以在另一個類中自動裝配的 bean,例如在 DishControllerTest 類中):
@AutoConfigureMockMvc
@TestComponent
public class AppMockMcv {
private static final String DISH_ENDPOINT = "/dishes";
private static final String BASE_INGREDIENTS_ENDPOINT = "/base-ingredients";
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
public List<DishDto> getMockDishes() throws Exception {
...
我想如何實體化我的測驗類:
@SpringBootTest
public class DishControllerTest {
@Autowired
private AppMockMcv appMockMcv;
@Test
void testGetDishes() throws Exception {
List<DishDto> dishes = appMockMcv.getMockDishes();
assertEquals(4, dishes.size());
assertNotNull(dishes);
DishAssertions.containsDish(dishes, "Pasta Carbonara");
}
現在我面臨的問題是我無法將 @AutoConfigureMockMvc 與 @TestComponent 一起使用,在自動裝配中找不到 bean。我還在 AppMockMcv 類中嘗試了@Component、@TestConfiguration、@SpringBootTest 注釋。
當前錯誤,雖然不是很有用:
No qualifying bean of type 'mtv.restaurant.mock.AppMockMcv' available:
expected at least 1bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)
我沒有找到太多關于如何創建一個僅用于測驗的 bean,以及如何將它與 AutoConfigureMockMvc 結合的資訊。另外,我試圖找到一種如何擴展 MockMvc 的方法,但沒有成功。
實作我想要實作的目標的正確方法是什么?
- 彈簧靴 2.5.4
uj5u.com熱心網友回復:
呵呵,在我開始學習 Spring Boot 之后,我往往會忘記基本的 Java ......
我想出的解決方案是我在 xControllerTest 類中 @Autowire 和 @AutoConfigureMockMvc 并創建 AppMockMcv @BeforeAll 測驗的實體,我在其中傳入 MockMvc 和 ObjectMapper。
這樣我就可以呼叫我的請求,并且只有一個類中的 Mvc 執行方法。
我將分享我的解決方案,但如果有人分享了如何正確完成的解決方案,我將不勝感激。
AppMockMcv:
public class AppMockMcv {
private static final String DISH_ENDPOINT = "/dishes";
private static final String BASE_INGREDIENTS_ENDPOINT = "/base-ingredients";
private final MockMvc mockMvc;
private final ObjectMapper objectMapper;
public AppMockMcv(MockMvc mockMvc, ObjectMapper objectMapper) {
this.mockMvc = mockMvc;
this.objectMapper = objectMapper;
}
public List<DishDto> getMockDishes() throws Exception {
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders
.get(DISH_ENDPOINT)
.queryParam("custom", "false"))
.andExpect(status().isOk())
.andReturn();
String contentAsString = mvcResult.getResponse().getContentAsString();
return objectMapper.readValue(contentAsString, new TypeReference<>() {
});
}
}
DishController測驗:
@AutoConfigureMockMvc
@SpringBootTest
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class DishControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
private AppMockMcv appMockMcv;
@BeforeAll
public void setup() {
appMockMcv = new AppMockMcv(mockMvc, objectMapper);
}
@Test
void testGetDishes() throws Exception {
List<DishDto> dishes = appMockMcv.getMockDishes();
assertEquals(4, dishes.size());
assertNotNull(dishes);
DishAssertions.containsDish(dishes, "Pasta Carbonara");
}
}
uj5u.com熱心網友回復:
我沒有找到太多關于如何創建一個僅用于測驗的 bean,以及如何將它與 AutoConfigureMockMvc 結合的資訊。另外,我試圖找到一種如何擴展 MockMvc 的方法,但沒有成功。
如果在 /test/java 下創建 bean,那么它只會在測驗中使用(在大多數情況下),即使使用了組件注解。檢查這里的資訊 - https://docs.spring.io/spring-boot/docs/1.4.3.RELEASE/reference/html/boot-features-testing.html (40.3.2)。
另外,我寫了一些代碼,例如,它可以作業(因為您沒有為 Spring 提供配置,所以我只使用了 @SpringBootApplication):
包源:
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
包 src.test:
@Component
public class CustomMockMVc {
public MockMvc getMockMvc() {
return mockMvc;
}
private final MockMvc mockMvc;
public CustomMockMVc(MockMvc mockMvc) {
this.mockMvc = mockMvc;
}
}
@SpringBootTest
@AutoConfigureMockMvc
public class TestComponent {
@Autowired
private CustomMockMVc customMockMVc;
@Test
public void testMockMvc() {
System.out.println(customMockMVc.getMockMvc());
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/349029.html
