2008-11-14 4 views
1

정적 최종 변수가있는 클래스에 대한 단위 테스트를 작성하고 있습니다. 그러나 정적 최종 var의 상태가 각 테스트에서 수정되므로 다시 초기화하는 방법이 필요합니다.단위 테스트 동안 정적 결승전을 다시 초기화하는 방법

어떻게 가능합니까? 일종의 사용자 정의 클래스 로더를 사용해야합니까? 당신의 JUnit 개미를 사용하는 가정

 
static final CountdownLatch latch = new CountdownLatch(1); 

+0

변경할 필요가있는 필드가있는 경우 최종적으로 변경하지 않으시겠습니까? –

답변

2

한 (매우 효율적이지) 접근 -

변수는 다음과 같이 초기화됩니다.

각 테스트 방법에 대해 별도의 클래스를 만든 다음 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

1

처음에는 정적 최종 변수를 어떻게 초기화합니까?

아마도 변수를 초기화하는 메소드를 조롱 할 수 있을까요?

예 : static final int number = getNumber();

getNumber() - 메서드를 조롱하여 원하는 값을 반환하면 '숫자'변수를 제어 할 수 있습니다.

+0

변수를 초기화하는 메소드를 사용하지 마십시오. – pdeva

0

"최종"변수가 단위 테스트 또는 기타 방법을 통해 수정되는 것은 생각할 수있는 유일한 방법은 바이트 코드 조작입니다.

+0

다음과 같이 사용할 때 문제가 발생할 수 있습니다. final MyMutableObject mmo = new MyMutableObject(); mm.setSomething ("ssssdsds"); – Marko

+0

네, 그렇습니다. – pdeva

0

문제의 변수가 정적이며 JVM에 한 번 존재한다는 점을 명확하게하기 위해 주석을 편집합니다.

최종이라고 표시된 변수는 한 번만 수정되어 다른 테스트에서 한 번 발생하는 것으로 보입니다. JUnit을 사용한다면 모든 테스트 전에 호출되는 setup() 호출마다 클래스의 새 인스턴스를 생성하십시오. 이것은 가장 빠르고 가장 대표적인 상황입니다.

+0

'정적'뿐만 아니라 '정적 최종'입니다. – pdeva

+0

hrm ... 좋은 지적. 아침 일찍부터. = D –

5

물론 리플렉션이나 클래스 로딩으로 해킹 할 수는 있지만 "내가 너라면 여기에서 시작하지 않을거야." 변경 가능한 통계는 실제로 악조건 (심지어 싱글 톤이라고하는 것)입니다. 따라서, 위에서 "매개 변수화"를 사용하여 코드를 잘 작성하도록 설계하십시오. 하드 와이어 된 것을 수행하거나 디렉토리 서비스를 사용하는 대신 객체를 필요로하는 객체로 전달하십시오.

0

정적 결승은 상수이므로 변경 가능하지 않습니다. 왜 다른 값으로 테스트합니까?

좋은 정적 최종 변수는 사용자 환경에 대한 상태를 유지하는 변수입니다. 예를 들어, 귀하의 운영 체제와 변수. 테스트 할 때 변경하지 않아도됩니다. 이 경우에는 다른 시스템 (또는 최소한 가상 시스템)에서 테스트해야합니다.

그러나이 변수를 다른 값으로 테스트하려고합니다. 따라서 수정 자 중 하나가 여기에 잘못되었거나 정적이거나 최종적인 것 같습니다. 그 중 하나가 여기에 필요한 의미와 일치하지 않습니다. 그렇지 않으면 다른 값으로 테스트하지 않으려 고합니다.

문제에 대해 더 자세히 설명해 주시겠습니까?

3

JDK 1.5부터 리플렉션을 통해 정적 결의를 바꿀 수 있습니다. (코드 예는 this link을 참조하십시오.) ...하지만 조언하지 않을 것입니다. 실제로 정적 변수는 가능한 한 피해야한다는 것을 과거에 보여주었습니다. Commons Logging은 좋은 예입니다. (설명을 확인하십시오 here).

최종 및 심지어 정적을 제거하십시오. 그 옵션이 없다면 리플렉션을 통해 수행하는 도우미 함수를 작성할 수 있습니다. 그러나 그것은 확실히 최악의 선택입니다.

+0

결승에서 탈락하는 것에 대해 강력하게 동의하지 않습니다. 그들은 일반적으로 적은 버그를 의미하는 코드를 예측 가능하게 만듭니다. –

+0

"정적"제거에 중점을 둡니다. – tcurdt

+0

그렇다면 답변을 검토해야합니다. "가능하면 최종본과 심지어 정적을 제거하십시오." :) –

관련 문제