我正在用JUnit和Spring(不是Boot(进行端到端集成测试。我想测试从 POST 请求一直到数据库。这是我的测试:
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@ContextHierarchy({
@ContextConfiguration(classes = TestConfig.class),
@ContextConfiguration(classes = OrderHdrController.class)
})
@ActiveProfiles("Test")
public class FilterActivityTest4 {
MockMvc mockMvc;
@Autowired
private WebApplicationContext wac;
@Before
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).dispatchOptions(true).build();
}
@Test
public void testActivity() {
OrderSearchDto orderSearchDto = new OrderSearchDto();
OrderSearchPanelDto orderSearchPanelDto = new OrderSearchPanelDto();
orderSearchPanelDto.setActivityTypes(Arrays.asList("TAKEOVER","DELIVERY"));
orderSearchDto.setOrderSearchPanelDto(orderSearchPanelDto);
try {
MvcResult result = this.mockMvc.perform(post("/orders/getOrderList")
.content(asJsonString(orderSearchDto))).andDo(MockMvcResultHandlers.print())
.andExpect(status().isOk())
.andReturn();
String content = result.getResponse().getContentAsString();
System.out.print(content);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String asJsonString(final Object obj) {
try {
final ObjectMapper mapper = new ObjectMapper();
final String jsonContent = mapper.writeValueAsString(obj);
return jsonContent;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
这是我的TestConfig.class:
@Autowired
private OrderManager orderManager;
@Bean
public OrderManager OrderManager() {
return orderManager;
}
在我的 OrderHdr 控制器类中:
@Controller
@RequestMapping("/orders")
public class OrderHdrController {
@Autowired
private OrderManager orderManager;
@RequestMapping(value = "/getOrderList", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> getOrderTables(OrderSearchDto orderSearchDto) {
...
orderHdrTables = orderManager.findAllOrders(orderSearchDto);
...
}
}
但是我的 orderManager 对象在我的控制器中为 null,在我运行测试时导致 Null 指针异常。
问题是:如何实例化订单管理器对象?是通过"自动连线"吗?
请帮忙。谢谢。
是的,
您必须通过Autowired
来实例化OrderManager
对象。
您提供的测试代码实际上并不执行端到端集成测试,因为它只是在测试 Spring 应用程序的 Web 层(控制器部分(。它不会启动整个 Spring 上下文,这将允许您将任何 bean 注入到测试代码中。
您可以删除TestConfig
并使用以下方法模拟OrderManager
豆:
@MockBean
private OrderManager orderManager;
这允许您使用 Mockito 控制OrderManager
的行为。所有这些都在下面的Spring指南中进行了描述。