2011-12-08 4 views
2

재생 1.2.4를 사용하고 있으며 작업을 테스트하기 위해 단위 테스트를 설정하려고합니다. 내 작업은 2 초마다 실행되며 일부 조건에 따라 특정 개체의 상태가 변경됩니다. 이것이 내가 이것을하는 데 사용하는 것입니다.스레드를 차단하지 않고 단위 테스트를 일시 중지하는 방법이 있습니까?

@Every("2s") 
public class GameScheduler extends Job { 
    public void doJob(){ 
     //Fetch of object from db and status change based on conditions happens here 
    } 
} 
내 단위 테스트에서 지금

, I 설정 이러한 조건하지만 테스트 설정 개체 중 하나를 가져 오는 전에 삼초 말을 기다려 어설가 작업 있는지 확인하기 위해 상태에 같음 싶은 ... 잘 했어.

내가

try { 
    Thread.sleep(3000); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 

같은 테스트 중지

pause(3000); 

또는 무언가를 사용하지만 작업도 중지합니다. 그것은 직업과 테스트가 같은 스레드에있는 것 같습니다. 작업을 중단하지 않고 테스트를 일시 중지 할 수있는 방법이 있습니까? 컨트롤러의 await() 메소드와 같은 것

답변

3

스케줄러가 작동하기 때문에 테스트 할 필요가 없습니다 (프레임 워크가 핸들링하고 있기 때문에). 필요한 것은 doJob 메서드가 작업을 수행하는지 테스트하는 것입니다. 이 상황 : 대부분의 트릭 (아마 모든 등이 읽기를) 할 것

GameScheduler job = new GameScheduler(); 
job.doJob(); 

// assert whatever you want here 
+0

유일한 문제는 직접 invokation에 대한 스케줄러 실행 다른 .. 현실 체크 marcospereira에 대한 – mericano1

+0

덕분에 두 번, 한 번 실행 작업이 될 수 있습니다. – Alain

0

간단하게 (당신을 위해 그것을 실행하는 스케줄러를 기다리지 않고) 작업을 테스트 비록 : 그래서, 그냥이 같은 테스트를 작성 수동으로 트리거하지 않아도되는 흥미로운 부분이 있습니다.

예를 들어 일반적인 구성 집합을 공유하는 게임 플레이 클러스터가 있습니다. 하나의 슬레이브에서 하나의 설정을 변경하고, 다른 모든 슬레이브는 메모를하고 동일한 작업을 수행합니다. 구성이 memcached에 유지된다고 가정 해 봅시다. 하나의 유용한 단위 테스트는 Cache.set을 사용하여 수동으로 일부 설정을 변경하고 configurationObserver 작업을 실행하는 데 걸리는 시간을 기다린 다음 내부 구성이 업데이트되었는지 확인하는 것입니다. 구성을 업데이트하는 일련의 작업이있는 경우이 작업이 더욱 도움이됩니다.

DEV 모드에서의 재생은 하나의 스레드를 사용함을 기억해야합니다 (많은 디버깅에 도움이 됨, btw). application.conf : % test.application.mode = prod에이 행을 추가하기 만하면 여러 스레드가 생깁니다.

나중에 편집 : 모드를 prod로 설정해도이 경우에는 도움이되지 않는 것으로 보입니다. 도움이되는 것은 "기다리는"마술을 사용하는 것입니다.

@Test 
public void myTest() { 
    final Lock lock = new ReentrantLock(); 
    final Condition goAhead = lock.newCondition(); 
    /* Here goes everything you need to do before "pausing" */ 
    lock.lock(); 
    try { 
     /** 
     * Set whatever time limit you want/need 
     * You can also use notifiers like goAhead.signal(), from within another thread 
     */ 
     goAhead.await(5, TimeUnit.SECONDS); 
    } catch (InterruptedException e) { 
     assertTrue(whateverINeedToTest); 
    } finally { 
     lock.unlock(); 
    } 
} 
관련 문제