使用JPA测试REST控制器的Spring启动

时间:2018-01-14 23:22:43

标签: unit-testing spring-boot spring-data-jpa spring-web

我在尝试测试时遇到问题

以下REST方法

    @GetMapping
    @RequestMapping("/create")
     ResponseEntity<Order> createOrders(@RequestBody String body) {
        ObjectMapper mapper = new ObjectMapper();
        try{
        Map<String,Object> mapBody = mapper.readValue(body,Map.class);
        Long cusId = Long.valueOf((int)mapBody.get("customer_id"));
        Customer customer = customerRepository.findOne(cusId);
        Product product = productRepository.findByProductName((String)mapBody.get("product_name"));
        Order order = new Order(customer,product,(int)mapBody.get("quantity"));
        orderRepository.saveAndFlush(order);
        return new ResponseEntity(order, HttpStatus.OK);
        }
        catch(Exception e){
            e.printStackTrace();
            return new ResponseEntity("error with original port", HttpStatus.EXPECTATION_FAILED);
        }
    }

我已经尝试了很多东西,似乎没什么用。 调用REST方法工作正常,但似乎我可以使用 我的测试中的@AutoConfigureMockMvc或@DataJpaTest

我的代码目前如下

 @SpringBootTest
 @AutoConfigureMockMvc
 @DataJpaTest
 public class OrderTest {

@Autowired
private MockMvc mockMvc;

@Autowired
private ProductRepository productRepositoryTest;

@Autowired
private CustomerRepository customerRepositoryTest;

@Test
public void submitNewOrdersForBricks() {

    try {

        Customer cus1 = new Customer("cus1");
        customerRepositoryTest.saveAndFlush(cus1);
        Product pro1 = new Product("brick1","red brick",0.96);
        productRepositoryTest.saveAndFlush(pro1);
        this.mockMvc.perform(post("/create")
                .content("{\"customer_id\":"+cus1.getCustomerId()+",\"product_name\":\"brick1\",\"quantity\":150}")
                .contentType(MediaType.APPLICATION_JSON))
                .andDo(print()).andExpect(status().isCreated())
                .andExpect(jsonPath("$.order_id").value(1));
    }
    catch(Exception e){
        e.printStackTrace();
    }

  }
}

我也尝试过使用

 when(customerRepository.findOne(cusId)).thenReturn(cus1);

这对我的控制器没有任何影响。 请注意,仅当我删除@DataJpaTest时才会调用控制器方法createOrders,但是不会为客户和产品创建ID。

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

@DataJpaTest用于存储库测试。在这种情况下,@ DataJpaTest是无用的。
而且,在测试课上,你错过了

@Autowired
private OrderRepository orderRepository;