자동구성으로 만든 JdbcTemplate을 응용하는 코드 작성 - 간단한 기능추가
Change Signiture 단축키 : cmd + F6
@Service
public class SimpleHelloService implements HelloService {
private final HelloRepository helloRepository;
public SimpleHelloService(HelloRepository helloRepository) {
this.helloRepository = helloRepository;
}
@Override
public String sayHello(String name) {
this.helloRepository.increaseCount(name);
return "Hello " + name;
}
}
HelloServiceTest를 인스턴스를 만들어서 실행하면 충분히 기능을 검증할 수 있었기 때문에 단위 테스트로 작성하였음(스프링 컨테이너를 띄워서 동작시킬 이유가 없음)
그러나 SimpleHelloService가 동작을 하려면 DB를 액세스하는 리포지토리 빈이 필요해졌기 때문에 변경이 필요해짐
2가지 결정사항 존재
컨테이너를 전부 띄우는 HellobootTest로 전환을 한 뒤 SimpleHelloService 빈을 가지고 오고 빈을 테스트용으로 초기화하여 실제 테스트하는 코드를 만들어 볼 수 있음 (→ 단순한 단위 테스트)
이 테스트를 통해서 확인하고 싶은 것은 HelloService의 기능인 sayHello를 호출하면 어떻게 인사를 하는지가 보고싶은 것 (관심사)
관심사와 count하는 기능은 연관이 없음. 이런 경우 helloRepository가 없으면 SimpleHelloService 타입의 새로운 오브젝트를 생성할 수 없으므로 담아주긴 해야되지만
내부에서 호출만해서 실행만 정상적으로 진행이 되도록 적당한 오브젝트를 넣어 주면 됨
(Dependency Injectiondms Spring Container같은 프레임워크 위에서만 동작아는 것이 아님)
⇒ HelloRepository 인터페이스를 구현한 인터페이스를 작성
이처럼 테스트를 도와주는 의존 오브젝트(협력 오브젝트)를 넣어주면 됨
메서드 추출 단축키 : cmd + opt + M
@Test
public void simpleHelloService() {
SimpleHelloService helloService = new SimpleHelloService(helloRepositoryStub);
String ret = helloService.sayHello("Test");
Assertions.assertThat(ret).isEqualTo("Hello Test");
}
private static HelloRepository helloRepositoryStub = new HelloRepository() {
@Override
public Hello findHello(String name) {
return null;
}
@Override
public void increaseCount(String name) {
}
};
sayHello를 호출하면 카운트가 올라가는 것을 확인하는 테스트
@HellobootTest
public class HelloServiceCountTest {
@Autowired
HelloService helloService;
@Test
public void sayHelloIncreaseCount() {
helloService.sayHello("Toby");
}
}