>source

응용 프로그램을 업그레이드 한 후 Spock 프레임 워크를 사용하여 실행되는 일부 통합 테스트를 실행하는 문제가 발생합니다.

클래스의 확장자 인 "mock"object를 반환하는 구성이 있습니다. 확장되는 클래스에는 선언시 초기화 된 해시 맵의 여러 구성원이 포함되어 있습니다.

@Bean 메소드가 리턴하기 전에 해당 개체를 수동으로 인스턴스화하면 모든 속성이 인스턴스화 된 모든 속성이 있습니다. 이 경우 기본적으로 LinkedHashMaps에서 초기화 된 여러 멤버가 있습니다. 그러나 @bean 메소드에서 반환되는 객체는 null에 할당 된 속성이 있습니다. 그래서 어떻게 든 멤버가 null로 설정되거나 객체가 모두 대체됩니다.

해당 맵의 접근자는 롬복에 의해 생성됩니다. 디버거에서 해당 클래스의 Bean이 메타 정보에 정의 된 접근자가 정의되어 있음을 알 수 있습니다. 속성 자체는 null입니다.

내 업그레이드는 2.1.9에서 2.5까지입니다. 테스트는 Groovy로 작성되고 스팍에서 실행됩니다. "mock"하위 클래스는 @testConfiguration 주석이 달린 클래스에서 작성되고 인스턴스화되지만 롬복 주석이있는 Java로 작성됩니다. 이것은 봄 2.1.9에서 일하기 위해 사용되었지만 2.5에서 깨지는 것입니다. debug= true로 응용 프로그램을 시작했지만 출력 중 어느 것도 단서 /리드를 제공하지 않았습니다.

여기에 어떤 아이디어가 도움이 될 것입니다. 답변을 돕기 위해 더 자세한 정보를 제공 할 수 있는지 알려주세요. 미리 감사드립니다!

구성 클래스 :

@TestConfiguration
public class IntegrationTestConfiguration {
    ...
    ...
    @Bean
    public MyCache spendAndMetricsCache() {
        CacheTestExtension myCache= new CacheTestExtension();
        return new CacheTestExtension();
    }
    ...
    ...
}

슈퍼 클래스 :

public class MyCache implements Reloadable {
private static final int HOUR_AND_DAY_LOOKBACK_DAYS= 2;
private static final int WEEK_LOOKBACK_DAYS= 8;
@Builder.Default @Getter
private Map<Long, TObjectLongHashMap<String>> lifetimeMetrics= new ConcurrentHashMap<>();
@Builder.Default @Getter
private Map<Long, TObjectLongHashMap<String>> monthlyMetrics= new ConcurrentHashMap<>();
...
...
}

확장 된 테스트 클래스 :

public class CacheTestExtension extends MyCache {
  protected Set<Integer> twoDayQueryIntervalIds() {
    return new HashSet<>();
  }
  protected Set<Integer> eightDayQueryIntervalIds() {
    return new HashSet<>();
  }
}

Debugger에서 CACHETeStextension을 인스턴스화 한 후에 중단하면 멤버 변수에 할당 된 해시 맵이 빈 맵으로 초기화됩니다. 내 컨텍스트가 자동으로가는 것과 함께 연결되면 캐시에 대한 참조가 CACHETeStextension의 인스턴스에 연결되어 있지만 멤버 변수는 null입니다.

당신이 의미하는 것을 보여주는 최소한의 예가 있습니까?

tim_yates2021-06-17 10:35:09

나는 팀에 동의한다. StackOverflow에서 code를 보여주기 위해 습관적이지 않고 묘사되지 않습니다. 설명은 애드온으로 훌륭하지만 독립적 인 질문이 아닙니다. 개발자는 문제를 이해하고 재현하기 위해 산문을 컴파일하고 디버그 할 수 없습니다. 그래서 이것처럼 묻는 것처럼 도움이되는 답변을 얻는 기회는 최소한이 아니라 아무도 당신을 도울 수 없기 때문에 아무도 도움이되지 않기 때문에 그렇지 않기 때문에 그렇지 않습니다. Mcve를 제공하십시오. 감사합니다.

kriegaex2021-06-17 10:35:09

@tim_yates -내 게시물을 보시려면 시간을내어 주셔서 감사합니다. 처음에 code를 남겨 두지 않는 것에 대해 사과드립니다. 나는 당신이 나를 도울 수 있도록 도와 줄 수있는 조각과 의견을 추가했습니다. 감사합니다.

DubbleD2021-06-17 10:35:09

업데이트 주셔서 감사합니다. 어쩌면 당신은 Mcve 조건을 오해했다 (전에 게시 한 링크를 읽으십시오!) 또는 "최소한의 예"를 읽으십시오. 최소한은 "너무 적게 재현하기가 너무 적지 않음"을 의미하지는 않지만 "재현하기에 충분합니다". 일관된 code 스 니펫 세트는 컴파일하거나 실행할 수 없습니다. 게다가, 당신은 spock에 대해 묻고 있지만, 스팍 테스트를 보여주지 않았습니다. 이것은 누군가가 같은 차에 액세스하지 않고도 당신의 차를 수리 할 것을 요구하는 것과 같습니다. 나는 당신이 당신의 질문을 다시 열지 않을 것이라고 생각합니다. 그래서 그것을 향상 시키십시오. 감사합니다.

kriegaex2021-06-17 10:35:09
  • 이전 python : 오류 : 요구 사항을 충족시키는 버전을 찾을 수 없습니다. Django== 1.10.5 버전에서 : 없음 오류 : 일치하는 배포 없음 Django== 1.10.5
  • 다음 DPLER 0의 필터 기능 0 OBS.