본문 바로가기
Blog/TIL

2025-01-09 (목)

by 코젼 2025. 1. 9.
728x90
반응형

순환 참조(circular dependency) 문제

  • java.lang.ClassCircularityError: java/lang/WeakPairMap$ Pair $Weak

    주요 원인

  • Mocking 문제: 동적으로 생성된 프록시 객체가 내부적으로 순환 참조를 발생시킬 수 있음.

    • 모든 mock 객체를 테스트 클래스 상단에서 일괄적으로 초기화.
  • 코틀린 리플렉션이나 클래스 로딩 과정에서의 문제일 수 있음.

    • 비활성화
      ```bash
  • Dkotlinx.coroutines.debug.enable.creation.stack.trace=false

  • Dkotest.framework.classpath.scanning.autoscan.disable=true
    ```

  • JVM 버전(corretto-17) 또는 설정이 특정 라이브러리와 호환되지 않아 발생할 수 있음.

    • JVM 옵션 조정 - idea64.exe.vmoptions 파일에 하단 내용 추가
      ```ruby
  • XX:+UnlockDiagnosticVMOptions

  • XX:+TraceClassLoading

  • XX:+TraceClassLoadingPreorder

  • XX:+DebugNonSafepoints
    ```

    타입 불일치 문제

  • java.lang.ClassCaseException

    • 타입의 반환값과 예상되는 타입 간의 불일치에서 발생함.
    • Hibernate 프록시 객체 문제
      • @ManyToOne(fetch = FetchType.LAZY)로 설정된 경우, businessUserAuth.getBusiness() 호출 시 Hibernate는 실제 Business 객체 대신 프록시 객체를 반환함.
      • 프록시 객체는 실제 클래스와 다른 동적 클래스일 수 있음.
    • Mockk와 Hibernate 프록시 충돌.
  • mocking 을 세부적으로 진행해야 오류 없이 동작함.

    context("승인된 비즈니스인 경우") {  
      it("헤더 쿠키 설정 및 BusinessAuthDTO.Response 객체 반환") {  
          val approveYnBusiness = TestDataFactory.createBusiness(approveYn = true)  
          val approveYnBusinessUserAuth = TestDataFactory.createBusinessUserAuth(approveYnBusiness)  
    
          every { businessDetailService.findById(businessId) } returns approveYnBusiness  
          every {  
              businessUserAuthService.findUserAuthByBusinessAndEmail(businessId, passportVO.email)  
          } returns Result.success(approveYnBusinessUserAuth)  
    
          every { businessUserAuthService.updateAccessed(businessId, passportVO.email) } just Runs  
          every { jwtComponent.setCookieByPayload(any()) } returns base.cookie  
    
          val response = businessDetailService.authority(businessId, passportVO)  
    
          response.body?.id shouldBe businessId  
          response.body?.auth shouldBe approveYnBusinessUserAuth.auth  
          response.body?.financialAuth shouldBe approveYnBusinessUserAuth.financialAuth  
          response.headers.getFirst(HttpHeaders.SET_COOKIE) shouldBe base.cookie  
          response.headers.getFirst(HttpHeaders.SET_COOKIE) shouldNotBe null  
      }  
    }
728x90
반응형

'Blog > TIL' 카테고리의 다른 글

2025-01-13 (월)  (1) 2025.01.13
2025-01-10 (금)  (1) 2025.01.10
2025-01-08 (수)  (0) 2025.01.08
2025-01-07 (화)  (0) 2025.01.07
2025-01-06 (월)  (0) 2025.01.06

댓글