레시피 16-5 통합 테스트에 테스트 픽스처 주입하기

umtuk·2022년 1월 28일
0

통합 테스트에 테스트 픽스처 주입하기

과제

스프링 애플리케이션에서 통합 테스트의 테스트 픽스쳐(test fixture)는 대부분 애플리케이션 컨텍스트에 선언한 빈. 스프링의 의존체 주입 장치를 사용해 자동으로 테스트 픽스쳐를 주입받을 수 있으면 일일이 애플리케이션 컨텍스트에서 가져오는 수고를 덜 수 있음.

해결책

스프링에서는 애플리케이션 컨텍스트에서 자동으로 빈을 가져와 테스트 픽스처를 주입 가능
테스트의 세터 메서드 또는 필드에 @Autowired, @Resource를 붙이면 가능
@Autowired는 타입에 따라, @Resource는 이름에 따라 픽스처를 주입

풀이

JUnit에서 테스트 컨텍스트 프레임워크의 테스트 픽스처 주입하기

테스트 컨텍스트 프레임워크를 이용해 작성한 테스트의 필드나 서터 메서드에 @Autowired 또는 @Resource를 붙이면 애플리케이션 컨텍스트에서 테스트 픽스쳐를 가져올 수 있음
JUnit에서는 지원 클래스를 상속하지 않아도 SpringRunner를 테스트 실행기로 지정 가능

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = BankConfiguration.class)
public class AccountServiceJUnit4ContextTests {

    private static final String TEST_ACCOUNT_NO = "1234";

    @Autowired
    private AccountService accountService;

    @Before
    public void init() {
        accountService.createAccount(TEST_ACCOUNT_NO);
        accountService.deposit(TEST_ACCOUNT_NO, 100);
    }
    ...
}

테스트의 필드나 서터 메서드에 @Autowired를 붙이면 타입을 기준으로 해당 빈을 자동연결해 주입.
@Qualifier에 이름을 적어 자동연결 후보 빈을 구체적으로 명시 가능
@Resource를 붙여 이름으로 빈을 찾아 자동연결 가능

테스트 컨텍스트 지원 클래스 AbstractJUnit4SpringContextTests를 상속해 애플리케이션 컨텍스트에서 테스트 픽스처를 가져와 주입 가능
SpringRunner는 상위 클래스에서 상속받기 때문에 따로 지정할 필요 없음

@ContextConfiguration(classes = BankConfiguration.class)
public class AccountServiceJUnit4ContextTests extends AbstractJUnit4SpringContextTests {

    private static final String TEST_ACCOUNT_NO = "1234";

    @Autowired
    private AccountService accountService;
    ...
}

TestNG에서 테스트 컨텍스트 프레임워크의 테스트 픽스처 주입하기

TestNG에서 테스트 컨텍스트 지원 클래스 AbstractTestNGSpringContextTests를 상속하면 애플리케이션 컨텍스트에서 테스트 픽스처를 가져와 주입 가능

@ContextConfiguration(classes = BankConfiguration.class)
public class AccountServiceTestNGContextTests extends AbstractTestNGSpringContextTests {

    private static final String TEST_ACCOUNT_NO = "1234";

    @Autowired
    private AccountService accountService;

    @BeforeMethod
    public void init() {
        accountService.createAccount(TEST_ACCOUNT_NO);
        accountService.deposit(TEST_ACCOUNT_NO, 100);
    }
    ...
}
profile
https://github.com/umtuk

0개의 댓글