정적 최종 변수가있는 클래스에 대한 단위 테스트를 작성하고 있습니다. 그러나 정적 최종 var의 상태가 각 테스트에서 수정되므로 다시 초기화하는 방법이 필요합니다.단위 테스트 동안 정적 결승전을 다시 초기화하는 방법
어떻게 가능합니까? 일종의 사용자 정의 클래스 로더를 사용해야합니까? 당신의 JUnit 개미를 사용하는 가정
static final CountdownLatch latch = new CountdownLatch(1);
정적 최종 변수가있는 클래스에 대한 단위 테스트를 작성하고 있습니다. 그러나 정적 최종 var의 상태가 각 테스트에서 수정되므로 다시 초기화하는 방법이 필요합니다.단위 테스트 동안 정적 결승전을 다시 초기화하는 방법
어떻게 가능합니까? 일종의 사용자 정의 클래스 로더를 사용해야합니까? 당신의 JUnit 개미를 사용하는 가정
static final CountdownLatch latch = new CountdownLatch(1);
한 (매우 효율적이지) 접근 -
변수는 다음과 같이 초기화됩니다.
각 테스트 방법에 대해 별도의 클래스를 만든 다음 forkmode를 perTest
으로 사용할 수 있습니다. Ant junit task documentation 상태로
: 당신은 몇 가지 테스트를 포크 할 경우 많은 자바 가상 머신이 어떻게 생성 되는가를
를 제어합니다. 가능한 값은 "perTest"(기본값), "perBatch"및 "once"입니다. "once"는 모든 테스트에 대해 하나의 Java VM 만 생성하고 "perTest"는 각 TestCase 클래스에 대해 새 VM을 만듭니다. "perBatch"는 각각의 중첩 된 < batchtest에 대해 VM을 생성하고 하나는 모든 중첩 된 < 테스트를 수집합니다. filtertrace, haltonerror, haltonfailure, errorproperty 및 failureproperty와 동일한 설정을 가진 테스트 만 VM을 공유 할 수 있으므로 forkmode를 "once"로 설정하더라도 Ant는 하나 이상의 Java VM을 생성해야 할 수도 있습니다. 새로운 Java VM에 포크되지 않는 테스트의 경우,이 속성은 무시됩니다. 이후 개미 1.6.2
처음에는 정적 최종 변수를 어떻게 초기화합니까?
아마도 변수를 초기화하는 메소드를 조롱 할 수 있을까요?
예 : static final int number = getNumber();
getNumber() - 메서드를 조롱하여 원하는 값을 반환하면 '숫자'변수를 제어 할 수 있습니다.
변수를 초기화하는 메소드를 사용하지 마십시오. – pdeva
문제의 변수가 정적이며 JVM에 한 번 존재한다는 점을 명확하게하기 위해 주석을 편집합니다.
최종이라고 표시된 변수는 한 번만 수정되어 다른 테스트에서 한 번 발생하는 것으로 보입니다. JUnit을 사용한다면 모든 테스트 전에 호출되는 setup() 호출마다 클래스의 새 인스턴스를 생성하십시오. 이것은 가장 빠르고 가장 대표적인 상황입니다.
'정적'뿐만 아니라 '정적 최종'입니다. – pdeva
hrm ... 좋은 지적. 아침 일찍부터. = D –
물론 리플렉션이나 클래스 로딩으로 해킹 할 수는 있지만 "내가 너라면 여기에서 시작하지 않을거야." 변경 가능한 통계는 실제로 악조건 (심지어 싱글 톤이라고하는 것)입니다. 따라서, 위에서 "매개 변수화"를 사용하여 코드를 잘 작성하도록 설계하십시오. 하드 와이어 된 것을 수행하거나 디렉토리 서비스를 사용하는 대신 객체를 필요로하는 객체로 전달하십시오.
정적 결승은 상수이므로 변경 가능하지 않습니다. 왜 다른 값으로 테스트합니까?
좋은 정적 최종 변수는 사용자 환경에 대한 상태를 유지하는 변수입니다. 예를 들어, 귀하의 운영 체제와 변수. 테스트 할 때 변경하지 않아도됩니다. 이 경우에는 다른 시스템 (또는 최소한 가상 시스템)에서 테스트해야합니다.
그러나이 변수를 다른 값으로 테스트하려고합니다. 따라서 수정 자 중 하나가 여기에 잘못되었거나 정적이거나 최종적인 것 같습니다. 그 중 하나가 여기에 필요한 의미와 일치하지 않습니다. 그렇지 않으면 다른 값으로 테스트하지 않으려 고합니다.
문제에 대해 더 자세히 설명해 주시겠습니까?
너 수 JDK 1.5부터 리플렉션을 통해 정적 결의를 바꿀 수 있습니다. (코드 예는 this link을 참조하십시오.) ...하지만 조언하지 않을 것입니다. 실제로 정적 변수는 가능한 한 피해야한다는 것을 과거에 보여주었습니다. Commons Logging은 좋은 예입니다. (설명을 확인하십시오 here).
최종 및 심지어 정적을 제거하십시오. 그 옵션이 없다면 리플렉션을 통해 수행하는 도우미 함수를 작성할 수 있습니다. 그러나 그것은 확실히 최악의 선택입니다.
결승에서 탈락하는 것에 대해 강력하게 동의하지 않습니다. 그들은 일반적으로 적은 버그를 의미하는 코드를 예측 가능하게 만듭니다. –
"정적"제거에 중점을 둡니다. – tcurdt
그렇다면 답변을 검토해야합니다. "가능하면 최종본과 심지어 정적을 제거하십시오." :) –
변경할 필요가있는 필드가있는 경우 최종적으로 변경하지 않으시겠습니까? –