Mockito:如何在functionToBeTested内部模拟另一个类的功能行为?

时间:2019-01-05 11:45:13

标签: java junit mockito

我有要测试的功能( 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一起运行。我为此付出了很多时间。

我真的开始变得绝望了,因为我还要测试其他类似的函数,在这里我必须模拟要调用的函数中我想测试的函数的其他返回值。预先感谢您提供的任何帮助。

0 个答案:

没有答案