• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Study Event Test 하는 법 문의드립니다.

20.10.26 23:44 작성 조회수 181

0

안녕하세요. 백기선 강사님 강의 참고하여 직접 코드 짜면서 공부하는 도 중 막히는 부분이 생겨 질문 남기게 되었습니다.

Study관련한  Event에 대해서 테스트를 해보려고 하는데요.

@Transactional
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.MOCK)
@AutoConfigureMockMvc
public class StudyNotificationTest {
	
	@Autowired MockMvc mockMvc;
	@Autowired ApplicationEventPublisher applicationEventPulbisher;
	@Autowired NotificationService notificationService;
	@Autowired NotificationRepository notificationRepository;
	@Autowired AccountService accountService;
	@Autowired AccountRepository accountRepository;
	@Autowired StudyService studyService;
	@Autowired StudyRepository studyRepository;
	@Autowired ZoneService zoneService;
	@Autowired TagService tagService;
	@Autowired TagRepository tagRepository;
	@Autowired ThreadPoolTaskExecutor executor;
	
	@BeforeEach
	public void boforeEach() {
		SignUpForm signUpForm = SignUpForm.builder()
				.email("test@test.com")
				.nickname("test")
				.password("12341234")
				.build();
		Account account = accountService.signUp(signUpForm);
		account.setStudyCreatedByEmail(true);
		account.setStudyCreatedByWeb(true);
		account.setStudyUpdatedByEmail(true);
		account.setStudyUpdatedByWeb(true);
		
		TagForm tagForm = TagForm.builder().title("test").build();
		Zone zone = zoneService.findAll().get(0);
		Tag tag = tagService.save(tagForm);
		accountService.addTag(account, tag);
		accountService.addZone(account, zone);
		
		StudyForm studyForm = StudyForm.builder()
				.fullDescription("test")
				.path("test")
				.shortDescription("test")
				.title("test").build();
		Study study = studyService.save(studyForm, account);
		studyService.addTag(study, tag);
		studyService.addZone(study, zone);	
	}
	
	@AfterEach
	public void afterEach() {
		accountRepository.deleteAll();
		studyRepository.deleteAll();
		tagRepository.deleteAll();
		notificationRepository.deleteAll();
	}
	
	@DisplayName("Study Created Event")
	@Test
	public void studyCreateEventTest() throws Exception {
		Study study = studyService.getOnlyStudyByPath("test");
		Account account = accountService.findByNickname("test");
		applicationEventPulbisher.publishEvent(new StudyCreatedEvent(study));
		
		executor.getThreadPoolExecutor().awaitTermination(1, TimeUnit.SECONDS);
		
		List<Notification> notifications = notificationService.findByNotificationType(NotificationType.STUDY_CREATED);
		assertTrue(notifications.stream().map(Notification::getAccount).collect(Collectors.toList()).contains(account));
	}

}

위와 같이 코드를 작성했는데, EventListener에서 Study를 조회하는 부분에서 ID에 해당하는 Study가 없다는 오류와 함께 테스트가 진행되지 않았습니다..

(executor 부분은 async 테스트 하는 방법 찾아보던 도중 발견한 코드입니다.)

해당 이벤트를 테스트할 수 있는 방법 문의드립니다.

감사합니다.  

답변 1

답변을 작성해보세요.

0

AsyncConfig를 테스트 사용시 비활성화 상태로 만들면 테스트시 비동기 리스너를 사용하지 않을테니 좀 더 테스트가 편해질 수 있습니다. AsyncConfig를 비활성화 시키는 방법은 스프링 프로파일을 사용해 해당 설정이 테스트 프로파일이 아닌 경우에만 사용하도록 설정하고 테스트 코드는 테스트 프로파일로 실행하도록 설정하면 그렇게 만들 수 있습니다.