문제

나는 특이한 상황을 나는 테스트입니다.내가 사용하고 에스프레소를 테스트합니다.내가 알고있는 에스프레소와 InstrumentationTestCase 하는 것은 아닙니다.

내가 수신기에서 작성한 하나의 클래스는 것이 나에게 통보의 변경의 특정 값입니다.내가 사용하는 청취자 내에서 테스트습니다.

은 다음과 같은 기능을 제공합니다.에서 값을 listener,I need to assert 값이 변경되었습니다.

내 문제 테스트가 끝나기 전에 나는 받을 것이 값을 형성합니다.

    private void sendSpeedChanges() {
    setStaticSpeed(new Random().nextInt(10) + 2);
    try {
        runTestOnUiThread(new Runnable() {
            @Override
            public void run() {
                consoleActivity.onSpeedChanged(getStaticSpeed(), false);
            }
        });
    } catch (Throwable throwable) {
        throwable.printStackTrace();
    }

}

private void createSpeedDelegate() {
    EspressoMachineValues.setOnSpeedChangeListener(new EspressoMachineValues.OnSpeedChangeListener() {
        @Override
        public void onSpeedChanged(double speed) {
            //assert speed is correct.
            assertTrue(getStaticSpeed() == speed);
        }
    });

}

이러한 두 가지 방법을 사용하고.이 createSpeedDelegate() 은 전화로 처음에.그런 다음 전화 sendSpeedChanges.나는 할 필요가 이 X-시간.


참고:

  • 약 200 밀리를 검색하는 정보에(평균).
  • sendSpeedChanges() 까지 체크인의 가치에 onSpeedChange()
  • 나는 사용할 수 없습니다 Thread.sleep(); 기 때문에 청취자에서 스레드가 있습니다.

추가 getInstrumentation().wait(2000);getInstrumentation().waitForIdleSync(); 분명히도 작동합니다.

완벽한 세계에서 나는 것이:

   for (int i = 0; i < 42; i++) {
        sendSpeedChanges();
        i++;
    }

그러나,이 기다리지 않습니다 값을 확인할 수 있습니다.내가 할 경우 기다리는 값,테스트를 주자고 생각하는 모든 테스트를 수행하고 종료됩니다.

나의 질문 은 것,있는 방법을 제어하는 시험 종료하는가?비록 나 테스트 을 수행 할 수 있습니다.

도움이 되었습니까?

해결책

에서 테스트를 만들어야 합니다 control 문을 유지하는 테스트를 실행하고 당신이 원하는만큼은 그것을 실행할 수 있습니다.

while(myTestNeedsToRun) {
    if(speedChangeReceived) {
        sendSpeedChange();
        speedChangeReceived = false;
    }
}

private void createSpeedDelegate() {
   EspressoMachineValues.setOnSpeedChangeListener(new EspressoMachineValues.OnSpeedChangeListener() {
    @Override
    public void onSpeedChanged(double speed) {
        //assert speed is correct.
        assertTrue(getStaticSpeed() == speed);
        speedChangedReceived = true;
    }
});

당신이 결정하면 당신은 실행이 완료된 테스트 설정 myTestNeedsToRun = false 그리고 당신의 테스트는 종료됩니다.

다른 팁

또는,당신은 당신이를 만들 수 있습 IdlingResource 모니터링하는 속도입니다.IdlingResource 은 방법으로 에스프레소 사용을 확인하는 메인 스레드가 유휴 상태이거나 없다는 것을 AsyncTasks 에서 실행 AsyncTask 수영장도 있습니다.

이점을 찾는 시 coutingIdlingResource 클래스에서 라이브러리 소스 코드입니다.구현할 수 있는 비슷한입니다.귀하의 경우에,그것은 무언가가 될 수 있습 다음과 같다:

[...]

private int mTargetSpeed;
private volatile ResourceCallback resourceCallback;

@Override
public boolean isIdleNow() {
  boolean isIdle = false;
  if (getStaticSpeed() == mTargetSpeed) {
     isIdle = true;
     resourceCallback.onTransitionToIdle();
  } else {
     isIdle = false;
  }

  return isIdle;
}

테스트에 대한 때마다,당신은 당신을 위해 기다리고 싶 속도를 원하는 수준에 도달해야 합:

[...]
SpeedIdlingResource speedIdlingResource = new SpeedIdlingResource ("my_idling_resource");
Espresso.registerIdlingResources(speedIdlingResource);

이 방법으로,에스프레소를 차단할 때까지 귀하의 헛도는 리소스를 알려줍 프레임워크의 SpeedMonitor 가 유휴 상태입니다.그 굿기 때문에 당신은 활용하는 모든 에스프레소 프레임워크를 동기화하면 모니터링을 목표에 도달하는 속도는,그래서 당신의 테스트는 것이 더 안정적이고 빠르게를 만들기 보다는 점령지 기다립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top