Java – Test simulation with Mockito

Test simulation with Mockito… here is a solution to the problem.

Test simulation with Mockito

I’m not very proficient in mockito, but I’m trying to test the behavior of mocks using mocks, which is class:

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();
    }

}

Here is the test class:

@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));

}

}

I want to assert that it returns GOLDEN_STATE_WARRIORS when the probability range is between 0 and 0.7, but my test code gets an empty assertion error.

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

Solution

simulateBasketballMatchResult is a mock object, so by default it will return null for all its methods (with non-original return values, of course).

Instead of simulating that object, monitor it:

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

Related Problems and Solutions