작성
·
297
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를 비활성화 시키는 방법은 스프링 프로파일을 사용해 해당 설정이 테스트 프로파일이 아닌 경우에만 사용하도록 설정하고 테스트 코드는 테스트 프로파일로 실행하도록 설정하면 그렇게 만들 수 있습니다.