Mockito проверить конструктор вызывает метод - PullRequest
0 голосов
/ 28 сентября 2018

Я пытаюсь проверить, когда создается экземпляр класса Game, вызывается ли метод start.Однако я получаю следующую ошибку:

Wanted but not invoked:
game.start();
Actually, there were zero interactions with this mock.

У меня есть следующий класс с именем Game

public class Game {
    private Hand player_hand;
    private Hand dealer_hand;
    public static Boolean isInPlay;

    public Game() {
        player_hand = new Hand();
        dealer_hand = new Hand();
        start();
    }

    public void start() {
        isInPlay = true;
        player_hand.hit();
        player_hand.hit();
        System.out.println("Player hand: ");
        player_hand.printHands();
        instantWinLose();
        dealer_hand.hit();
        dealer_hand.hit();
    }
}

У меня есть тестовый класс с именем GameTest

@RunWith(MockitoJUnitRunner.StrictStubs.class)

public class GameTest {

@InjectMocks
Game game;

@Mock
Hand hand;

    @Test
    public void testGameConstruction() {
        Game mockedGame = mock(Game.class);
        verify(mockedGame, times(1)).start();
    }
}

Я новичок в Мокито.Я попробовал следующие примеры в Разница между @Mock и @ InjectMocks , но я все еще получаю ту же ошибку

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

На самом деле, вам нужно вызвать метод start, тогда только ваш макет будет проверен со временем.

что-то вроде :: mockedGames.start ()

Тогда будет проверен только его вызов

0 голосов
/ 28 сентября 2018

Когда вы вызываете Mockito.mock(SomeType.class), Mockito будет динамически создавать подкласс для этого типа, но для создания экземпляров он использует определенные методы, чтобы избежать вызова супер-конструктора ( read more ).

Попробуйте это:

public class Foobar {

    public Foobar () {
        throw new RuntimeException();
    }

}

// Somewhere else ...
Mockito.mock(Foobar.class); // No exception will be thrown because constructor is never called

Это имеет смысл, когда вы думаете об этом: свежий фиктивный объект не должен ничего делать, если это абсолютно не требуется (заглушка).Вызов любой реальной логики может иметь нежелательные побочные эффекты.

И именно поэтому вы никогда не издеваетесь над самим тестируемым классом!

Когда вы высмеиваете сам тестируемый класс, ваши тесты имеютабсолютно никакого значения вообще!

Только ложные зависимости.

Ваш класс Game не имеет зависимостей, поэтому вам не понадобятся никакие насмешки:

    @Test
    public void testGameConstruction() {
        Game game = new Game();
        assertTrue(game.isInGame());
    }

Если у Game есть зависимости, например Hand, вы можете добавить параметры конструктора:

public Game (Hand hand1, Hand hand2) { .... }

, а затем:

    @Test
    public void testGameConstruction() {

        Hand handMock1 = Mockito.mock(Hand.class);
        Hand handMock2 = Mockito.mock(Hand.class);
        Game game = new Game(handMock1, handMock2);

        verify(handMock1, times(1)).hit();
        verify(handMock2, times(1)).hit();

    }
0 голосов
/ 28 сентября 2018

Насколько я понимаю, издеваясь над классом игры, вы также издеваетесь над конструктором.Это означает, что не был выполнен код из фактического конструктора классов.Попробуйте создать экземпляр класса Game без насмешек.

...