Right now do !

[JAVA]JUnit의 이상한 활용-동기화된 Test Class

by 지금당장해

 요즘 구현하는 프로그램에 통신에 관련된 내용이 포함되다 보니 Test를 만들어 가는 과정이 점점 힘들어진다. 통신은 동시에 같은Port를 열수 없는데 JUnit의 Test는 동시 다발적으로 Test함수를 실행시킨다. 그러다 보니 테스트 함수 하나 하나는 잘 돌아가는데 Class를 통체로 돌리거나 Suit를 돌리면 포트 충돌이난다. 뭐 포트를 다 다르게 주면 되는데 또 나의 집착이 또 극에 다달았다. "난 시간 많아 왜 테스트가 때로 돌면서 나를 괴롭혀 하나 하나씩 돌란말이야... 그리고 난 포트를 각각 주기도 싫다고. " 이게 아니다 나도 알면서 또 오기가 생겨 한번 해보고 싶었다. 동기화 되어 하나씩 돌아가는 Test를 ~~ 아주 간단한 아이디어를 냈다. 같은 포트를 쓰는 Test함수들을 모두 동기화 시키자. 그래서 아래와 같은 시도를 해봤다. 

 

    @Test
    public void test1()  {

        synchronized (this) {
        	// 소캣을 사용하는 코드 ... 물론 같은 포트를 쓴다.    	
        }
    }

    @Test(expected = LifecycleException.class)
    public void getSessionSynchronizer_ex() throws LifecycleException {

        synchronized (this) {
            // 소캣을 사용하는 코드 ... 물론 같은 포트를 쓴다.
        }
    }

야심차게 이 테스트를 실행했다. 결과는 똑 같다 ... 포트가 충돌한다. 왜 그럴까?? 그럴리가 없는데 synchronized를 분명히 사용 했는데.... 설마.... 그럴수 있는 가능성은 this가 다른 경우 밖에는 없다. 그리고 바로 확인 들어 갔다. 각 Test 함수에서 this.hashCode()를 확인 해봤다. 각자가 다른 해쉬를 가지고 있었다. 그렇다 JUnit은 Test를 실행 할 때 각각 Instance를 만들고 있었던 것이다. 그래서 @BeforeClass @AfterClass함수들이 static이어야 했던 것이다. 자 여기서 물러설 내가 아니다. 해결할 방법이 있다. 그렇다 Static으로 동기화 객체를 하나 생성해서 쓰면 된다. 

 

    private static final Object synchObj = new Object();

    @Test
    public void getSessionSynchronizer()  {
        synchronized (SessionSynchronizerTest.synchObj) {
    		// 블라 블라 테스트 코드
        }
    }

    @Test(expected = LifecycleException.class)
    public void getSessionSynchronizer_ex() throws LifecycleException {
        synchronized (SessionSynchronizerTest.synchObj) {
        	// 블라 블라 테스트 코드
        }
    }

성공 했다. 테스트가 순서는 없어도 하나 끝나면 다른하나가 시작된다. 해서 충돌도 없다. 의미가 있는 것인지는 나도 아직 모르겠다. ^^

블로그의 정보

지금 당장 해!!!

지금당장해

활동하기