Добро пожаловать на борт Stackoverflow!
Это решение без насмешек, потому что я не вижу причин использовать насмешки.
Все, что вам нужно, это заменить случайную функцию пользовательскойодин в тестах.
Класс Card
имеет статическое поле randomGenerator
, которое будет перезаписано в тестах.Кстати, я упростил determineFace()
до одной строки и удалил явный конструктор, чтобы получить более компактный код.
class Card {
static Supplier<Integer> randomGenerator = () -> (int) (Math.random() * 13);
static String[] supportedFs =
new String[]{"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
final CardValue value = new CardValue(determineFace());
final Suite suit = determineSuit();
static String determineFace() {
return supportedFs[randomGenerator.get()];
}
static Suite determineSuit() {
// TODO: to be finished according to your logic.
return Suite.CLUBS;
}
}
Это пример тестового класса:
public class CardTest {
@Test
public void cardConstructionWhenRandomIsZero() {
// Given custom random generator which returns always 0.
Card.randomGenerator = () -> 0;
// When
Card actualCard = new Card();
// Then
Assert.assertEquals("2", actualCard.value.face);
Assert.assertEquals(0, actualCard.value.numeric);
Assert.assertEquals(Suite.CLUBS, actualCard.suit);
}
@Test
public void cardConstructionWhenRandomIsOne() {
// Given custom random generator which returns always 1.
Card.randomGenerator = () -> 1;
// When
Card actualCard = new Card();
// Then
Assert.assertEquals("3", actualCard.value.face);
Assert.assertEquals(0, actualCard.value.numeric);
Assert.assertEquals(Suite.CLUBS, actualCard.suit);
}
}
КонечноВ общем, вы можете использовать провайдеров данных для объединения тестовых случаев для каждого из возможных случайных значений.
Один из недостатков решения, приведенного выше, состоит в том, что реальное генерирование случайных чисел не будет проверяться.В этом случае вы можете иметь тест с реальной случайной генерацией, но сопоставить фактическое значение как часть поддерживаемых значений:
@Test
public void cardConstructionWithRealRandom() {
// When
Card actualCard = new Card();
// Then
Assert.assertThat(actualCard.value.face, Matchers.isIn(Card.supportedFs));
}
ОБНОВЛЕНИЕ : на основе комментариев.
Если вы все еще хотите использовать Mockito
, вы можете эмулировать поведение генератора случайных чисел следующим образом:
@Test
public void cardConstructionWhenRandomIsZero() {
// Given custom random generator which returns always 0.
Card.randomGenerator = Mockito.mock(Supplier.class);
Mockito.when(Card.randomGenerator.get()).thenReturn(0);
// When
Card actualCard = new Card();
// Then
Assert.assertEquals("2", actualCard.value.face);
Assert.assertEquals(0, actualCard.value.numeric);
Assert.assertEquals(Suite.CLUBS, actualCard.suit);
}
UPDATE 2 : на основекомментарии.
@Mock
Supplier<Integer> mockedRandomGenerator;
@Test
public void cardConstructionWhenRandomIsZero() {
// Given custom random generator which returns always 0.
Card.randomGenerator = mockedRandomGenerator;
Mockito.when(mockedRandomGenerator.get()).thenReturn(0);
// When
Card actualCard = new Card();
// Then
Assert.assertEquals("2", actualCard.value.face);
Assert.assertEquals(0, actualCard.value.numeric);
Assert.assertEquals(Suite.CLUBS, actualCard.suit);
}