본문 바로가기

Spring

다형성을 이용해 익명 객체를 만들어 테스트 하기

자바에서 특정 클래스를 테스트 할 때, 의존하는 객체를 주입받아 테스트한다. 본 포스팅에서는 SpringBoot에서 다형성을 이용해 객체를 주입받아 테스트 하는 방법에 대해 알아본다.

 

테스트 환경

 

CatalogRestController.java

 

 

 

 

현재 CatalogRestController.java은 CatalogService.java 를 주입받아 사용한다. createCatalog()는 CatalogService.java 의 save() 메소드에게 입력받은 값을 저장하도록 위임한다.

 

 

CatalogService.java

 

 

 

 

 

CatalogService.java 는 인터페이스이고, 현재 save() 메소드 하나만 가지고 있다. CatalogService.java 를 직접 구현한 객체는 없는 상황이다.

 

 

 

테스트 케이스 작성

 

 

 

 

 

catalog를 생성하는 요청에 대한 테스트 케이스이다.

새로운 카탈로그 정보(requestCatalog)를 "/catalogs"에 POST 요청으로 보내면, "CATALOG-004" 값을 반호나해야 테스트 케이스에 성공한다.

 

지금상태로 실행하면 CatalogService bean 을 찾을 수 없으니, Bean을 등록하라고 나온다.

 

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.example.userservice.catalogs.adapter.presentation.CatalogRestController required a bean of type 'com.example.userservice.catalogs.adapter.presentation.CatalogService' that could not be found.


Action:

Consider defining a bean of type 'com.example.userservice.catalogs.adapter.presentation.CatalogService' in your configuration.

 

CatalogRestController 는 CatalogService를 의존하므로, CatalogService를 구현한 구현체를 주입받아야 한다. 만약 CatalogService 의 구현체가 Repository도 주입받는다면, CatalogRestController를 테스트하기위해 CatalogService, CatalogRepository를 모두 구현해야 한다.

 

 

Test 용 Bean 등록

테스트 환경에서만 사용할 수 있는 Bean 을 만들어 등록해 사용할 수 있다. 위 에러 메세지의 Action 항목을 보면, CatalogService 타입의 Bean 을 Configuration 에 설정하라고 한다.

 

@SpringBootTest 를 실행하면 ComponentScan을 통해서 감지되는 Bean을 생성한다. 또한 @Configuration 애너테이션을 사용하는 클래스 내부에서 @Bean 애너테이션을 통해 생성되는 빈도 등록된다.

 

테스트 환경에서 사용하는 Configuration 클래스에는 @TestConfiguration 애너테이션을 붙여서 사용한다.

 

 

AppTestConfiguration.java

 

 

 

 

 

테스트 케이스에서 사용할 Bean 을 정의한다. CatalogService 구현체를 따로 작성해도 되지만, 여기서는 익명클래스로 작성한다.

 

이제 테스트 실행시 @TestConfiguration을 감지할 수 있도록 설정해야 한다.

 

 

 

@Import 애너테이션으로 사용할 Configuration 클래스를 지정한다.

@TestConfiguration 애터네이션을 사용한 AppTestConfiguration.class 를 입력한다. 

 

그리고 다시 테스트를 수행하면, 테스트 케이스가 성공하는 것을 확인할 수 있다.

 

 

 

마치며

지금까지 다형성을 이용해 테스트 케이스에서 사용할 객체를 만들어 "POST /catalogs" 를 테스트 해봤다. "CATALOG-004" 를 반환하는 케이스만 작성했지만, 여러가지 경우를 직접 설정해 테스트 할 수 있다.

 

테스트 케이스마다 CatalogService.save() 를 따로 구현해서 Bean 으로 등록해 테스트하는 것은 번거롭다. 다음 포스팅에서는 Mockito 프레임워크를 이용해 테스트 하는 방법을 알아본다.

 

 

'Spring' 카테고리의 다른 글

Mockito 프레임워크를 이용해 테스트하기  (0) 2021.09.21