我有要测试的功能( confirmOrder ),需要一个对象“客户客户” ,该对象是通过从另一个类调用方法来定义的“ CustomerManagement” ,其功能调用为 customerManagement.getVerifiedCustomer()
我想模拟customerManagement类,以便在ClassBeingTested(CartController)中调用该函数时,它使用我想要的对象“ Customer”。
因此,我尝试了模仿类CustomerManagement和 when()。thenReturn()函数(从Mockito无效)的常用方法。创建客户管理类的间谍的工作情况甚至更糟,因为Mockito抛出了一个错误,表明该类无法被模拟。 (请注意,模拟现在会引发错误)。
@Controller
@SessionAttributes("cart")
@GetMapping("/orderScreen/orderConfirm")
CustomerOrder order;
public String confirmOrder(@RequestParam("decide") String decider, @ModelAttribute Cart cart) {
Customer customer = customerManagement.getVerifiedCustomer();
order = new CustomerOrder(customer);
if(decider.equals("takeItYourself")){
order.setDeliverableState(false);
} else {
order.setDeliverableState(true);
}
if (cart.getPrice().isGreaterThanOrEqualTo(Money.of(30, EURO))){
return "redirect:freeBeverage";
}
createOrder(cart);
return "redirect:complete";
}
@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class CartControllerTest{
@Autowired
CartController cartController;
Customer customer;
CustomerManagement customerManagement;
@Before
public void setUp(){
initMocks(this);
customer = new Customer("Jane", "Doe", "123");
customerManagement = mock(CustomerManagement.class)
when(customerManagement.getVerifiedCustomer()).thenReturn(customer);
cartToEmpy = new Cart();
cartToEmpy.addOrUpdateItem(beverage, 3);
}
@Test
public void confirmOrderPickUp(){
String decider = "takeItYourself";
String returnedView = cartController.confirmOrder(decider, cartToEmpy);
assertThat(returnedView).isEqualTo("redirect:complete");
}
}
因此,当我运行该测试类时,它会完全忽略 when()。thenReturn(),并与要测试的类中的 Customer customer 对象一起运行该函数当然,哪个会引发 IllegalArgumentException ,因为此Customer设置为null,而Constructor CustomerOrder不采用null的Customer对象。
请注意,我无法更改类的代码,因此必须找到一种测试方法。
遗憾的是,PowerMock也不可选,因为它似乎不喜欢jdk 9并与Mockito一起运行。我为此付出了很多时间。
我真的开始变得绝望了,因为我还要测试其他类似的函数,在这里我必须模拟要调用的函数中我想测试的函数的其他返回值。预先感谢您提供的任何帮助。