Java - тестирование симуляции с Mockito - PullRequest
0 голосов
/ 21 ноября 2018

Я не очень хорошо разбираюсь в Mockito, но пытаюсь использовать mocks для проверки поведения симуляции, это класс:

package simulator;

import java.util.Map;

import org.apache.commons.lang3.Validate;
import simulator.enums.Team;
import simulator.fixtures.Fixture;

public class SimulateBasketballMatchResult implements Simulation<Team> {

    private final Fixture fixture;

    public SimulateBasketballMatchResult(Fixture fixture) {

        Validate.notNull(fixture, "fixture cannot be null");

        this.fixture = fixture;
    }

    @Override
    public Team simulate(Map<Team, Double> outcomeProbabilityMap) {

        Validate.notNull(outcomeProbabilityMap, "outcomeProbabilityMap cannot be null");

        final Team homeTeam = fixture.getHomeTeam();
        final Team awayTeam = fixture.getAwayTeam();

        double random = randomDoubleGenerator();

        double homeWinProbability = outcomeProbabilityMap.get(homeTeam);

        return random < homeWinProbability ? homeTeam : awayTeam;

    }

    public Double randomDoubleGenerator() {
        return Math.random();
    }

}

Ниже приведен класс тестирования:

@RunWith(MockitoJUnitRunner.class)
public class SimulateBasketballMatchResultTest {

    @Rule
    public ExpectedException expectedException = ExpectedException.none();

    private static final Map<Team, Double> MATCH_RESULT_PROBABILITY_MAP = new HashMap<>();

    private static final Fixture FIXTURE = new Fixture(GOLDEN_STATE_WARRIORS, HOUSTON_ROCKETS, REGULAR_SEASON);

    static {
        MATCH_RESULT_PROBABILITY_MAP.put(FIXTURE.getHomeTeam(), 0.7d);
        MATCH_RESULT_PROBABILITY_MAP.put(FIXTURE.getAwayTeam(), 0.3d);
    }

    @Mock
    private SimulateBasketballMatchResult simulateBasketballMatchResult;

    @Test
    public void shouldReturnGoldenStateWarriorsAsWinner() {

        when(simulateBasketballMatchResult.randomDoubleGenerator()).thenReturn(0.5d);

        assertThat(simulateBasketballMatchResult.simulate(MATCH_RESULT_PROBABILITY_MAP), is(GOLDEN_STATE_WARRIORS));

    }

}

Я хотел бы заявить, что GOLDEN_STATE_WARRIORS возвращается, когда диапазон вероятности находится в диапазоне от 0 до 0,7, однако я получаю нулевую ошибку утверждения с моим тестовым кодом.

java.lang.AssertionError: 
Expected: is <GOLDEN_STATE_WARRIORS>
     but: was null
Expected :is <GOLDEN_STATE_WARRIORS>

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

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

@Mock
private Fixture fixture;

private SimulateBasketballMatchResult simulator;

@Before
public void setUp() {
    simulator = spy(new SimulateBasketballMatchResult(fixture));
    doCallRealMethod().when(simulator).simulate();
}

@Test
public void shouldReturnGoldenStateWarriorsAsWinner() {
    doReturn(0.5).when(simulator).randomDoubleGenerator();
    when(fixture.getHomeTeam()).thenReturn(GOLDEN_STATE_WARRIORS);
    when(fixture.getAwayTeam()).thenReturn(HOUSTON_ROCKETS);

    assertThat(simulator.simulate(MATCH_RESULT_PROBABILITY_MAP), is(GOLDEN_STATE_WARRIORS));
}

Mockito.spy и @Spy позволяют вам смоделировать некоторые методы реального объекта, но Mockito.mock и @Mock издеваются над всемobject.

A mock в mockito - это обычный mock (позволяет блокировать вызовы; то есть возвращать конкретные значения из вызовов методов).

шпион в мокито - это частичная имитация (часть объекта будет насмехаться, а часть будет использовать реальные вызовы методов).

Подробнее

0 голосов
/ 21 ноября 2018

simulateBasketballMatchResult является фиктивным объектом, поэтому по умолчанию он возвращает null для всех своих методов (которые, конечно, имеют не примитивное возвращаемое значение).

Вместо высмеивая этот объект, вы, вероятно, должны шпион это:

@Spy
private SimulateBasketballMatchResult simulateBasketballMatchResult = 
    new SimulateBasketballMatchResult(Fixture);
...