• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

ArchUnit test 질문입니다.

22.07.22 10:18 작성 조회수 122

0

안녕하세요. 백기선님. 유익한 강의 만들어주셔서 감사합니다.

 

저는 현재 패키지 구조 ArchUnit Test 부분을 수강하고 있습니다. 강좌에서 인텔리제이를 활용해 

@ArchTest 어노테이션으로 해당 문제점을 빠르게 콘솔로 확인할 수 있는 것을 보고 제가 사용중인 VSCODE에서 진행했더니

테스트 성공/실패 결과는 볼 수 있으나 어디가 문제인지는 알려주지 않았습니다. 해서 여러 문서들을 보고 Junit 테스트 코드 때 사용했던 코드들을 바탕으로 해서 ArchRule을 만들어 마지막 check 메소드를 호출해 테스트 하니 결과를 받아볼 수 있었습니다.

 

VSCODE에서 ArchUnit에 대한 디버깅 방법을 구하고자 하는 것이 아니라,  문법은 틀리나 같은 테스트 코드라고 생각이 되어 돌린 이 테스트 코드에 대해서 말씀드립니다. @ArchTest 에서는 성공하였으나, Junit 쪽에서는 실패로 나타나 해당 이유가 궁금해 질문드립니다.

 

아래 관련파일 첨부합니다. 

 

 

< 실패한 JUNIT >

 

<오류내용>

java.lang.AssertionError: Architecture Violation [Priority: MEDIUM] - Rule 'slices matching 'com.study.inf.modules.(*)..' should be free of cycles' was violated (1 times):
Cycle detected: Slice account -] Slice settings -] Slice account
Dependencies of Slice account
Method [com.study.inf.modules.account.AccountService.updateNotifications(com.study.inf.modules.account.Account, com.study.inf.modules.settings.forms.Notifications)] has parameter of type [com.study.inf.modules.settings.forms.Notifications] in (AccountService.java:0)
Method [com.study.inf.modules.account.AccountService.updateProfile(com.study.inf.modules.account.Account, com.study.inf.modules.settings.validator.Profile)] has parameter of type [com.study.inf.modules.settings.validator.Profile] in (AccountService.java:0)
Dependencies of Slice settings
Constructor [com.study.inf.modules.settings.SettingsController.[init](com.study.inf.modules.account.AccountService, org.modelmapper.ModelMapper, com.study.inf.modules.settings.validator.NicknameValidator, com.study.inf.modules.tag.TagService, com.study.inf.modules.tag.TagRepository, com.study.inf.modules.zone.ZoneRepository, com.fasterxml.jackson.databind.ObjectMapper)] has parameter of type [com.study.inf.modules.account.AccountService] in (SettingsController.java:0)
Constructor [com.study.inf.modules.settings.WithAccountSecurityContextFactory.[init](com.study.inf.modules.account.AccountService)] has parameter of type [com.study.inf.modules.account.AccountService] in (WithAccountSecurityContextFactory.java:0)
Constructor [com.study.inf.modules.settings.validator.NicknameValidator.[init](com.study.inf.modules.account.AccountRepository)] has parameter of type [com.study.inf.modules.account.AccountRepository] in (NicknameValidator.java:0)
Field [com.study.inf.modules.settings.SettingsController.accountService] has type [com.study.inf.modules.account.AccountService] in (SettingsController.java:0)
Field [com.study.inf.modules.settings.SettingsControllerTest.accountRepository] has type [com.study.inf.modules.account.AccountRepository] in (SettingsControllerTest.java:0)
Field [com.study.inf.modules.settings.SettingsControllerTest.accountService] has type [com.study.inf.modules.account.AccountService] in (SettingsControllerTest.java:0)
Field [com.study.inf.modules.settings.WithAccountSecurityContextFactory.accountService] has type [com.study.inf.modules.account.AccountService] in (WithAccountSecurityContextFactory.java:0)
Field [com.study.inf.modules.settings.validator.NicknameValidator.accountRepository] has type [com.study.inf.modules.account.AccountRepository] in (NicknameValidator.java:0)
Method [com.study.inf.modules.settings.SettingsController.addTag(com.study.inf.modules.account.Account, com.study.inf.modules.tag.TagForm)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.addZone(com.study.inf.modules.account.Account, com.study.inf.modules.zone.ZoneForm)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.removeTag(com.study.inf.modules.account.Account, com.study.inf.modules.tag.TagForm)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.removeZone(com.study.inf.modules.account.Account, com.study.inf.modules.zone.ZoneForm)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.updateAccount(com.study.inf.modules.account.Account, com.study.inf.modules.settings.forms.NicknameForm, org.springframework.validation.Errors, org.springframework.ui.Model, org.springframework.web.servlet.mvc.support.RedirectAttributes)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.updateAccountForm(com.study.inf.modules.account.Account, org.springframework.ui.Model)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.updateNotifications(com.study.inf.modules.account.Account, com.study.inf.modules.settings.forms.Notifications, org.springframework.validation.Errors, org.springframework.ui.Model, org.springframework.web.servlet.mvc.support.RedirectAttributes)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.updateNotificationsForm(com.study.inf.modules.account.Account, org.springframework.ui.Model)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.updatePassword(com.study.inf.modules.account.Account, com.study.inf.modules.settings.forms.PasswordForm, org.springframework.validation.Errors, org.springframework.ui.Model, org.springframework.web.servlet.mvc.support.RedirectAttributes)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.updatePasswordForm(com.study.inf.modules.account.Account, org.springframework.ui.Model)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.updateProfile(com.study.inf.modules.account.Account, com.study.inf.modules.settings.validator.Profile, org.springframework.validation.Errors, org.springframework.ui.Model, org.springframework.web.servlet.mvc.support.RedirectAttributes)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.updateProfileForm(com.study.inf.modules.account.Account, org.springframework.ui.Model)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.updateTags(com.study.inf.modules.account.Account, org.springframework.ui.Model)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.SettingsController.updateZonesForm(com.study.inf.modules.account.Account, org.springframework.ui.Model)] has parameter of type [com.study.inf.modules.account.Account] in (SettingsController.java:0)
Method [com.study.inf.modules.settings.WithAccountSecurityContextFactory.createSecurityContext(com.study.inf.modules.settings.WithAccount)] calls constructor [com.study.inf.modules.account.form.SignUpForm.[init]()] in (WithAccountSecurityContextFactory.java:26)
Method [com.study.inf.modules.settings.WithAccountSecurityContextFactory.createSecurityContext(com.study.inf.modules.settings.WithAccount)] calls method [com.study.inf.modules.account.form.SignUpForm.setNickname(java.lang.String)] in (WithAccountSecurityContextFactory.java:27)
Method [com.study.inf.modules.settings.WithAccountSecurityContextFactory.createSecurityContext(com.study.inf.modules.settings.WithAccount)] calls method [com.study.inf.modules.account.form.SignUpForm.setEmail(java.lang.String)] in (WithAccountSecurityContextFactory.java:28)
Method [com.study.inf.modules.settings.WithAccountSecurityContextFactory.createSecurityContext(com.study.inf.modules.settings.WithAccount)] calls method [com.study.inf.modules.account.form.SignUpForm.setPassword(java.lang.String)] in (WithAccountSecurityContextFactory.java:29)
Method [com.study.inf.modules.settings.WithAccountSecurityContextFactory.createSecurityContext(com.study.inf.modules.settings.WithAccount)] calls method [com.study.inf.modules.account.AccountService.processNewAccount(com.study.inf.modules.account.form.SignUpForm)] in (WithAccountSecurityContextFactory.java:30)

Method [com.study.inf.modules.settings.validator.NicknameValidator.validate(java.lang.Object, org.springframework.validation.Errors)] calls method [com.study.inf.modules.account.AccountRepository.findByNickname(java.lang.String)] in (NicknameValidator.java:31)
Method [com.study.inf.modules.settings.WithAccountSecurityContextFactory.createSecurityContext(com.study.inf.modules.settings.WithAccount)] calls method [com.study.inf.modules.account.AccountService.loadUserByUsername(java.lang.String)] in (WithAccountSecurityContextFactory.java:33)
Method [com.study.inf.modules.settings.SettingsControllerTest.afterEach()] calls method [com.study.inf.modules.account.AccountRepository.deleteAll()] in (SettingsControllerTest.java:70)
Method [com.study.inf.modules.settings.SettingsController.updateProfile(com.study.inf.modules.account.Account, com.study.inf.modules.settings.validator.Profile, org.springframework.validation.Errors, org.springframework.ui.Model, org.springframework.web.servlet.mvc.support.RedirectAttributes)] calls method [com.study.inf.modules.account.AccountService.updateProfile(com.study.inf.modules.account.Account, com.study.inf.modules.settings.validator.Profile)] in (SettingsController.java:98)
Method [com.study.inf.modules.settings.SettingsControllerTest.addZone()] calls method [com.study.inf.modules.account.AccountRepository.findByNickname(java.lang.String)] in (SettingsControllerTest.java:98)
Method [com.study.inf.modules.settings.SettingsControllerTest.addZone()] calls method [com.study.inf.modules.account.Account.getZones()] in (SettingsControllerTest.java:100)
Method [com.study.inf.modules.settings.SettingsControllerTest.removeZone()] calls method [com.study.inf.modules.account.AccountRepository.findByNickname(java.lang.String)] in (SettingsControllerTest.java:107)
Method [com.study.inf.modules.settings.SettingsControllerTest.removeZone()] calls method [com.study.inf.modules.account.AccountService.addZone(com.study.inf.modules.account.Account, com.study.inf.modules.zone.Zone)] in (SettingsControllerTest.java:109)
Method [com.study.inf.modules.settings.SettingsController.updatePassword(com.study.inf.modules.account.Account, com.study.inf.modules.settings.forms.PasswordForm, org.springframework.validation.Errors, org.springframework.ui.Model, org.springframework.web.servlet.mvc.support.RedirectAttributes)] calls method [com.study.inf.modules.account.AccountService.updatePassword(com.study.inf.modules.account.Account, java.lang.String)] in (SettingsController.java:118)
Method [com.study.inf.modules.settings.SettingsControllerTest.removeZone()] calls method [com.study.inf.modules.account.Account.getZones()] in (SettingsControllerTest.java:120)
Method [com.study.inf.modules.settings.SettingsController.updateNotifications(com.study.inf.modules.account.Account, com.study.inf.modules.settings.forms.Notifications, org.springframework.validation.Errors, org.springframework.ui.Model, org.springframework.web.servlet.mvc.support.RedirectAttributes)] calls method [com.study.inf.modules.account.AccountService.updateNotifications(com.study.inf.modules.account.Account, com.study.inf.modules.settings.forms.Notifications)] in (SettingsController.java:138)
Method [com.study.inf.modules.settings.SettingsController.updateTags(com.study.inf.modules.account.Account, org.springframework.ui.Model)] calls method [com.study.inf.modules.account.AccountService.getTags(com.study.inf.modules.account.Account)] in (SettingsController.java:147)
Method [com.study.inf.modules.settings.SettingsControllerTest.addTag()] calls method [com.study.inf.modules.account.AccountRepository.findByNickname(java.lang.String)] in (SettingsControllerTest.java:149)
Method [com.study.inf.modules.settings.SettingsControllerTest.addTag()] calls method [com.study.inf.modules.account.Account.getTags()] in (SettingsControllerTest.java:150)
Method [com.study.inf.modules.settings.SettingsControllerTest.removeTag()] calls method [com.study.inf.modules.account.AccountRepository.findByNickname(java.lang.String)] in (SettingsControllerTest.java:157)
Method [com.study.inf.modules.settings.SettingsControllerTest.removeTag()] calls method [com.study.inf.modules.account.AccountService.addTag(com.study.inf.modules.account.Account, com.study.inf.modules.tag.Tag)] in (SettingsControllerTest.java:159)
Method [com.study.inf.modules.settings.SettingsController.addTag(com.study.inf.modules.account.Account, com.study.inf.modules.tag.TagForm)] calls method [com.study.inf.modules.account.AccountService.addTag(com.study.inf.modules.account.Account, com.study.inf.modules.tag.Tag)] in (SettingsController.java:160)
Method [com.study.inf.modules.settings.SettingsControllerTest.removeTag()] calls method [com.study.inf.modules.account.Account.getTags()] in (SettingsControllerTest.java:161)
Method [com.study.inf.modules.settings.SettingsControllerTest.removeTag()] calls method [com.study.inf.modules.account.Account.getTags()] in (SettingsControllerTest.java:172)
Method [com.study.inf.modules.settings.SettingsController.removeTag(com.study.inf.modules.account.Account, com.study.inf.modules.tag.TagForm)] calls method [com.study.inf.modules.account.AccountService.removeTag(com.study.inf.modules.account.Account, com.study.inf.modules.tag.Tag)] in (SettingsController.java:173)
Method [com.study.inf.modules.settings.SettingsController.updateZonesForm(com.study.inf.modules.account.Account, org.springframework.ui.Model)] calls method [com.study.inf.modules.account.AccountService.getZones(com.study.inf.modules.account.Account)] in (SettingsController.java:181)
Method [com.study.inf.modules.settings.SettingsControllerTest.updateAccount_success()] calls method [com.study.inf.modules.account.AccountRepository.findByNickname(java.lang.String)] in (SettingsControllerTest.java:197)
Method [com.study.inf.modules.settings.SettingsController.addZone(com.study.inf.modules.account.Account, com.study.inf.modules.zone.ZoneForm)] calls method [com.study.inf.modules.account.AccountService.addZone(com.study.inf.modules.account.Account, com.study.inf.modules.zone.Zone)] in (SettingsController.java:198)
Method [com.study.inf.modules.settings.SettingsController.removeZone(com.study.inf.modules.account.Account, com.study.inf.modules.zone.ZoneForm)] calls method [com.study.inf.modules.account.AccountService.removeZone(com.study.inf.modules.account.Account, com.study.inf.modules.zone.Zone)] in (SettingsController.java:210)
Method [com.study.inf.modules.settings.SettingsController.updateAccount(com.study.inf.modules.account.Account, com.study.inf.modules.settings.forms.NicknameForm, org.springframework.validation.Errors, org.springframework.ui.Model, org.springframework.web.servlet.mvc.support.RedirectAttributes)] calls method [com.study.inf.modules.account.AccountService.updateNickname(com.study.inf.modules.account.Account, java.lang.String)] in (SettingsController.java:229)
Method [com.study.inf.modules.settings.SettingsControllerTest.updateProfile()] calls method [com.study.inf.modules.account.AccountRepository.findByNickname(java.lang.String)] in (SettingsControllerTest.java:237)
Method [com.study.inf.modules.settings.SettingsControllerTest.updateProfile()] calls method [com.study.inf.modules.account.Account.getBio()] in (SettingsControllerTest.java:238)
Method [com.study.inf.modules.settings.SettingsControllerTest.updateProfile_error()] calls method [com.study.inf.modules.account.AccountRepository.findByNickname(java.lang.String)] in (SettingsControllerTest.java:255)
Method [com.study.inf.modules.settings.SettingsControllerTest.updateProfile_error()] calls method [com.study.inf.modules.account.Account.getBio()] in (SettingsControllerTest.java:256)
Method [com.study.inf.modules.settings.SettingsControllerTest.updatePassword_success()] calls method [com.study.inf.modules.account.AccountRepository.findByNickname(java.lang.String)] in (SettingsControllerTest.java:281)
Method [com.study.inf.modules.settings.SettingsControllerTest.updatePassword_success()] calls method [com.study.inf.modules.account.Account.getPassword()] in (SettingsControllerTest.java:282)
 at com.tngtech.archunit.lang.ArchRule$Assertions.assertNoViolation(ArchRule.java:92)
 at com.tngtech.archunit.lang.ArchRule$Assertions.check(ArchRule.java:82)
 at com.tngtech.archunit.lang.ArchRule$Factory$SimpleArchRule.check(ArchRule.java:196)
 at com.tngtech.archunit.lang.syntax.ObjectsShouldInternal.check(ObjectsShouldInternal.java:81)
 at com.tngtech.archunit.library.dependencies.SliceRule.check(SliceRule.java:64)
 at com.study.inf.modules.ArchUnitTestCode.slice(ArchUnitTestCode.java:55)
 at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)
 at java.base/java.util.ArrayList.forEach(ArrayList.java:1541)

 

답변 1

답변을 작성해보세요.

0

java.lang.AssertionError: Architecture Violation [Priority: MEDIUM] - Rule 'slices matching 'com.study.inf.modules.(*)..' should be free of cycles' was violated (1 times):

Cycle detected: Slice account -] Slice settings -] Slice account

 

처음 이 세줄만 잘 읽어보시면 에러 원인을 파악하실 수 있을 것 같습니다. 에러 내용을 보면 @ArchTest에서도 실패했어야 할 것 같은데 이상하네요. 혹시 해당 테스트가 실행이 안됐던 것은 아닐까요. 흠..