Stub

Test double that replaces a collaborator that provides indirect input. Stubs can be created “by hand” or by using a mocking framework. Such frameworks often don’t make any distinctions between stubs and mock objects (mocks), which makes people use the terms incorrectly and leads to confusing tests.

A good rule to remember is that a stub can never make a test fail, whereas a mock can. This means that there will never be any assertions or verifications on a stub.

Example

Consider a Robot class that has some kind of distance sensor.

public class Robot {
    private Sensor sensor;

    public Robot(Sensor sensor) {
        this.sensor = sensor;
    }

    public void move() {
        if (sensor.getDistance() < 10.0) {
            // do something
            // ...
        }
    }
}

In this case, the sensor is a source of indirect input. Because Sensor is an interface and constructor injection is already in place, stubbing by hand would look like:

public class SensorReturningTooClose implements Sensor {
    @Override
    public double getDistance() {
        return 5.0;
    }
}

And stubbing by a framework would look like this:

Sensor sensor = mock(Sensor.class);
when(sensor.getDistance()).thenReturn(5.0);

Back to the vocabulary