개발하고자 하는 것 : 사용자가 매일 계산 능력을 훈련하는 애플리케이션
: 온라인에서 무작위로 생성되는 곱셈 문제를 풀고 싶음. 매일 암산으로 두뇌 훈련을 해야 하니까 문제는 너무 쉽지 않아야 함!
-> 세부적인 태스크로 나누기
테스트 주도 개발은 로직보다 테스트를 먼저 작성!
package microservices.book.multiplication.domain;
/**
* 애플리케이션에서 곱셈을 나타내는 클래스
*/
public class Multiplication {
// 인수
private int factorA;
private int factorB;
// A * B 의 결과
private int result;
public Multiplication(int factorA, int factorB) {
this.factorA = factorA;
this.factorB = factorB;
this.result = factorA * factorB;
}
public int getFactorA() {
return factorA;
}
public int getFactorB() {
return factorB;
}
public int getResult() {
return result;
}
@Override
public String toString() {
return "Multiplication{" + "인수A=" + factorA + ", 인수B=" + factorB + ", 결과(A*B)=" + result + '}';
}
}
package microservices.book.multiplication.service;
import microservices.book.multiplication.domain.Multiplication;
public interface MultiplicationService {
/**
* 두 개의 무작위 인수를 인수를 담은 {@link Multiplication} 객체를 생성한다.
* 무작위로 생성되는 숫자의 범위는 11~99.
*
* @return 무작위 인수를 담은 {@link Multiplication} 객체
*/
Multiplication createRandomMultiplication();
}
package microservices.book.multiplication.service;
public interface RandomGeneratorService {
/**
* @return 무작위로 만든 11 이상 99 이하의 인수
*/
int generateRandomFactor();
}
package microservices.book.multiplication.service;
import microservices.book.multiplication.domain.Multiplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MultiplicationServiceTest {
@MockBean
private RandomGeneratorService randomGeneratorService;
@Autowired
private MultiplicationService multiplicationService;
@Test
public void createRandomMultiplicationTest() {
// given (randomGeneratorService 가 처음에 50, 나중에 30을 반환하도록 설정)
given(randomGeneratorService.generateRandomFactor()).willReturn(50, 30);
// when
Multiplication multiplication = multiplicationService.createRandomMultiplication();
// assert
assertThat(multiplication.getFactorA()).isEqualTo(50);
assertThat(multiplication.getFactorB()).isEqualTo(30);
assertThat(multiplication.getResult()).isEqualTo(1500);
}
}
-> 그냥 코드만 작성하면 @RunWith 등의 어노테이션에 에러가 뜬다 JUnit4 Classpath를 add 해주면 해결된다.
아직 MultiplicationService의 구현체를 만들지 않았기 때문에 테스트 결과는 실패함! 요구사항을 확인한 후 작성해준다.
package microservices.book.multiplication.service;
import microservices.book.multiplication.domain.Multiplication;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
class MultiplicationServiceImpl implements MultiplicationService {
private RandomGeneratorService randomGeneratorService;
@Autowired
public MultiplicationServiceImpl(RandomGeneratorService randomGeneratorService) {
this.randomGeneratorService = randomGeneratorService;
}
@Override
public Multiplication createRandomMultiplication() {
int factorA = randomGeneratorService.generateRandomFactor();
int factorB = randomGeneratorService.generateRandomFactor();
return new Multiplication(factorA, factorB);
}
}
애플리케이션의 요구사항과 테스트 주도 개발 접근법을 알아봄
-> TDD로 간단한 스프링 부트 애플리케이션을 만듦