Поведение Mockito по умолчанию и пользовательское поведение с методами с одинаковыми типами возврата - PullRequest
1 голос
/ 29 мая 2019

Supossing У меня есть следующий код для проверки UserController путем насмешки UserService (где UserController имеет ссылку на UserService):

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
...

public class UserControllerTest {
    private final List<User> users1 = new ArrayList<>();
    private final List<User> users2 = new ArrayList<>();

    @Before
    public void initUsers() {
        User user = new User();
        user.setId(1L);
        users1.add(user);

        User user = new User();
        user.setId(2L);
        users2.add(user);
    }

    @Test
    public void testFindAlls() throws Exception {
        UserService userService = mock(UserService.class); //line1
        when(userService.findAll1()).thenReturn(users1); //line2
        when(userService.findAll2()).thenReturn(users2); //line3

        UserController userController = new UserController();
        ReflectionTestUtils.setField(userController, "userService", userService);
        List<User> users3 = userController.findAll1(); //line4
        List<User> users4 = userController.findAll2(); //line5

        ...
    }
}

У меня есть следующие сомнения:

  1. Когда будет достигнута строка1, какое поведение будет по умолчанию для userService.findAll1() и userService.findAll2()?
  2. Когда достигнута строка3, когда userService.findAll1() и userService.findAll2() возвращают один и тот же тип результата (List<User>). Будет ли line3 переопределять поведение, определенное в line2? Я имею в виду, userService.findAll1() вернет users2 вместо users1?
  3. Я имею в виду, что сигнатура метода when равна public static <T> OngoingStubbing<T> when(T methodCall), поэтому T в примере будет элементом типа List<User> со значением, вероятно, равным null. Итак, как метод when может определить, что различные вызовы передаются в качестве аргументов?

1 Ответ

2 голосов
/ 29 мая 2019

1.Когда вы что-то макетируете, все методы, которые имеют тип возвращаемого значения, просто возвращают ноль по умолчанию (или эквиваленты в случае примитивов).Поскольку макет сам по себе не имеет реализации, вызов метода ничего не делает (в основном он обрабатывает как пустой метод).

2.С чего бы это?Вы отображаете разные возвращаемые значения для разных методов, нет возможности переопределить что-либо.

Edit3: я только что удалил свою предыдущую попытку объяснить это.Содержание ссылки лучше всего, что я могу придумать.Так что это нелегко понять.

Как работает вызов mockito when ()?


На другой ноте:
Возможно, вы этого не сделаетенужно использовать Reflections, чтобы поместить макет в ваш объект.Проверьте @InjectMocks & @Mock.Поэтому, как вы можете их использовать (или как их использовать), зависит от вашей версии JUnit и Mockito.( Как использовать Mockito с JUnit5 )

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