Mockito: как смоделировать поведение функции другого класса внутри functionToBeTested? - PullRequest
0 голосов
/ 05 января 2019

У меня есть функция, которую я хочу протестировать ( verifyOrder ), для которой нужен объект "Клиент-клиент" , который определяется путем вызова метода из другого класса "CustomerManagement " с вызовом функции customerManagement.getVerifiedCustomer ()

Я хочу смоделировать класс customerManagement, чтобы при вызове функции в моем ClassBeingTested (CartController) он использовал нужный объект "Customer".

Поэтому я попробовал обычные методы насмешки над классом CustomerManagement и функцией when (). ThenReturn () из Mockito, но безрезультатно. Создание шпиона CustomerManagementClass работало еще хуже, так как 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, а конструктор CustomerOrder не принимает нулевые объекты Customer.

Обратите внимание, что я не могу изменить код классов и поэтому должен найти способ проверить это.

PowerMock также, к сожалению, не подходит, так как он, похоже, не любит jdk 9 и работает совместно с Mockito. Я пытался и потратил впустую часы на это.

Я действительно начинаю впадать в отчаяние, так как у меня есть другие подобные функции, которые я должен проверить, где я должен смоделировать другие результаты от функций, вызываемых с помощью функции, которую я хочу проверить. Заранее благодарю за любую доступную помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...