JUnit 端到端集成测试



我正在用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指南中进行了描述。

最新更新