我有一个使用2个fein客户端的rest控制器,我想用不同的示例编写和测试Rest控制器,我不是编写springboot测试的Maven。
在这个场景中,我没有要测试的存储库,只是假装通过REST控制器访问客户端。下面是我的测试控制器代码
@RestController
public class CustomerController {
@Autowired
private CustomerClient customerClient;
@Autowired
private PaymentsClient paymentsClient;
@RequestMapping(path = "/getAllCustomers", method = RequestMethod.GET)
public ResponseEntity<Object> getAllCustomers() {
List<Customer> customers = customerClient.getAllCustomers();
return new ResponseEntity<>(customers, HttpStatus.OK);
}
@RequestMapping(path = "/{customerId}", method = RequestMethod.GET)
public ResponseEntity<Object> get(@PathVariable() long customerId) {
try {
Customer c = customerClient.getCustomerById(customerId);
if (c != null) {
return new ResponseEntity<>(c, HttpStatus.OK);
} else {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Customer Not Found");
}
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}
@RequestMapping(path = "/{customerId}", method = RequestMethod.PATCH)
public ResponseEntity<Object> UpdateCustomer(@PathVariable() Long customerId, @RequestBody Customer customer) {
Customer c;
try {
c = customerClient.update(customerId, customer);
if (c != null) {
return new ResponseEntity<>(c, HttpStatus.OK);
} else {
return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Customer Not Found");
}
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}
@RequestMapping(path = "", method = RequestMethod.POST)
public ResponseEntity<Object> saveCustomer(@RequestBody Customer customer) {
Customer c;
try {
c = customerClient.saveCustomer(customer);
return new ResponseEntity<>(c, HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}
@RequestMapping(path = "/registerPayment", method = RequestMethod.POST)
public ResponseEntity<Object> saveCustomer(@RequestBody Payment payment) {
Payment p = null;
Customer c = null;
try {
c = customerClient.getCustomerById(payment.getCustomerId());
p = paymentsClient.saveCustomer(payment);
return new ResponseEntity<>(p, HttpStatus.OK);
} catch (Exception e) {
if (null == c) {
return ResponseEntity.status(HttpStatus.UNPROCESSABLE_ENTITY).body("Customer Does not Exist");
} else {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage());
}
}
}
我见过的大多数测试都注入了一个存储库,但对于我的情况,我没有这些,只是fein客户端,我做错了,
下面是我目前的测试
@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("test")
public class CustomerControllerTest {
@Autowired
private MockMvc mockMvc;
@InjectMocks
private CustomerController customerController;
@Before
public void setup() {
mockMvc = MockMvcBuilders.standaloneSetup(customerController).build();
}
@Test
public void getAllCustomers() {
try {
this.mockMvc.perform(get("/getAllCustomers")).andExpect(status().isOk())
.andExpect(content().json("[{\n" + " \"customerId\": 24,\n"
+ " \"firstName\": \"Benjamin\",\n" + " \"secondName\": \" Masiga\",\n"
+ " \"email\": \"ben@ben.com\"\n" + " }"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我得到下面的错误,
NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.test.web.servlet.MockMvc' available: expected at least 1 bean which qualifies as autowire candidate.
3条答案
按热度按时间pkln4tw61#
它就像编写任何其他JUnit测试一样简单。
rryofs0p2#
@InjectMocks应该只在你想运行忽略Spring框架的纯Java单元测试时使用。当您运行@SpringBootTest时,Spring框架会尝试初始化并将所有bean注入到应用程序上下文中。@InjectMocks不会这样做!如果你想测试你的SpringBoot应用程序是否配置正确,你应该将你的FeignClients添加为@MockBeans。SpringFramework将用mock版本替换类的真实示例。然后,您可以像修改任何其他模拟对象一样修改行为。下面是一个例子:
集成测试
kxe2p93d3#
您需要自己的
feign.Client
,它可以在MockMvc之外工作:并使用它创建您的虚拟客户端:
因此,对于可以进行
MockMvc
集成测试的测试,现在可以通过feign客户端调用它。