class ControllerTest {
@Mock
private IEmailGateway emailGateway; // mock 생성
@Mock
private IDatabase database; // mock 생성
@Test
public void sending_a_greetings_email() {
// given
Controller sut = new Controller(emailGateway, database);
// when
sut.greetUser("user@gamil.com");
// then
then(emailGateway)
.should(times(1))
.sendGreetingEmail("user@email.com"); // 테스트 대역으로 하는 SUT의 호출을 검사
}
@Test
public void creating_a_report() {
// given
given(database.getNumberOfUsers()).willReturn(10); // stub 생성
Controller sut = new Controller(emailGateway, database);
// when
Report report = sut.createReport();
// then
assertThat(10).isEqualTo(report.getNumberOfUsers());
}
}
스텁과의 상호 작용을 검증하는 것은 취약한 테스트를 야기하는 일반적인 안티 패턴이다.
@Test
public void purchase_fails_when_not_enough_inventory() {
// given
Store storeMock = mock(Store.class);
given(storeMock.hasEnoughInventory(Product.SHAMPOO, 5)).willReturn(false); // 준비된 응답을 설정
Customer sut = new Customer();
// when
boolean success = sut.purchase(storeMock, Product.SHAMPOO, 5);
// then
assertThat(success).isFalse();
then(storeMock).should(times(0)).removeInventory(Product.SHAMPOO, 5); // SUT에서 수행한 호출을 검사
}