본문 바로가기

Reading Record/스프링 배치 완벽 가이드

13장 배치 처리 테스트하기

Junit과 Mockito를 사용한 단위 테스트

특징

  • 단일 테스트: 단하나를 테스트한다. 단위테스트의 범위는 하나의 메서드다.
  • 격리: 의존성은 시스템을 테스트하는 데 혼란을 줄 수 있다. 각 의족성의 통합을 테스트 하는 것이 아닌 개별 컴포넌트의 동작 방식을 테스트한다.
  • 반복 가능한 방식: 브라우저를 띄워 애플리케이션을 매번 반복 클릭하는 것은 번거롭고 어려운 일이다. 단위 테스트는 동일한 시나리오를 반복해서 수행할 수 있어야 한다.

Junit

  • 자바로 된 프레임워크를 테스트하는 프레임워크
  • 클래스의 단위 테스트를 할 수 있는 기능을 제공

Mock

  • 테스트하기 어려운 외부 의존성을 대체해 비지니스 로직 테스트에 집중할 수 있도록 도와주는 도구
  • Stub과 다른 도구로 스텁은 하드코딩된 구현체로, 런타임 시에 필요한 동작을 정의할 수 있는 목객체가 재사용 가능한 구조인 경우에 해당된다.
  • 프록시 기반 방식
    • 의존객체를 프록시 객체로 대체해 테스트 클래스에 주입하는 방식
    • 객체 생성을 의존성을 가지는 메인 컴포넌트에서 하지 않아야 한다.
  • 클래스 재매핑
    • 클래스 로더에게 로딩되는 클래스 파일에 대한 참조를 재매핑하도록 지시한다.
    • 어떤 구현체도 클래스로더에 주입할 수 있기 때문에 프록시 객체 접근 방식보다 더 강력하지만, 모든 기능을 사용하기 위해 필요한 클래스 로더에 대해 이해해야 가능하다.

스프링 클래스를 사용해 통합 테스트하기

다른 여러 컴포넌트 간의 상호작용이 정상적으로 수행되는지 테스트는 것

Job/Step 테스트하기

  • StepScope가 없는 테스트
    • 스프링 컨텍스트와 batch job에서 사용하고 있는 의존성에 관련한 context만 추가해서 테스트가능하다.
    • StepScope가 설정되어있지 않은 Step의 구성품을 테스트할때는 @SpringBatchTest 설정없이 테스트 가능하다.
  • StepScope가 선언된 구성품 테스트
    • JobParameter는 JobScope 혹은 StepScope가 있는 환경에서만 사용할 수 있다보니 스프링 컨택스트만으로 테스트가 불가하다.
    • StepScope는 Step의 실행시점에 해당 컴포넌트를 Spring Bean으로 생성한다.
    • StepScope가 선언되어 있는 환경을 테스트하려면 step이 실행하는 것처럼 컨택스트를 생성해야한다.
      • Spring batchd에서는 이걸 해결하기 위해 StepScopeTestExecutionListener를 제공한다.
      • Step StepExecution을 제공하는 메서드(getStepExecution)를 정의하면 StepScopeTestExecutionListener는 해당 메서드를 활용해서 StepExecution을 생성하고 Step이 실행된것처럼 테스트 메소드의 컨텍스트로 활용한다.
      • @SpringBatchTest는 테스트에 사용하는 TestExecutionLisener를 지원한다.
  • Job/Step 테스트하기
    • Step을 테스트하기 위해서 JobLauncherTestUtils를 사용해 정의된 스텝을 실행한다.
    • 스프링 배치가 실행시 자신이 트랜잭션을 제어해야하는데 다른 트랜잭션으로 래핑하면 정상수행이 불가능하다
      • 스프링 배치가 실행시 자신이 트랜잭션을 제어해야하는데 다른 트랜잭션으로 래핑하면 정상수행이 불가능하다
      • AbstractJobRepositoryFactoryBean의 validateTransactionState 참조
      • jobRepository가 사용되기 전에 트랜잭션 여부를 확인한다.