내가 하는일/[JAVA] Java Language

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

지금당장해 2019. 7. 12. 19:12

 요즘 구현하는 프로그램에 통신에 관련된 내용이 포함되다 보니 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) {
        	// 블라 블라 테스트 코드
        }
    }

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