일상적인 프로그램을 모방하는 모의 개체를 사용하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1143322

문제

내 프로그램에는 알람 시계 이벤트와 비슷한 일상이 있습니다. 오후 2시 (시간은 내 PC의 시스템 시간) 일 때 나를 위해 무언가를하십시오.

내가하고 싶은 것은 테스트 기간의 속도를 높이는 것입니다. 모의 대상의 위키, 작가는 Alarm Clock 프로그램을 언급했습니다. 나는 너무 기뻤지 만 여전히 어떻게 해야할지 모르겠다.

나는 Mock Object를 처음 접했고 Java로 프로그래밍하고 있습니다. 따라서 jmock 또는 easymock (또는 유사한)은 나에게 괜찮을 것입니다.

감사

도움이 되었습니까?

해결책

현재 시간을 가져와야 할 때마다 시스템 클럭을 직접 사용하지 마십시오. 다음과 같은 인터페이스를 사용하십시오.

public interface Clock
{
    long currentMillis();
}

그런 다음 생산을위한 시스템 시계로이를 구현하고 테스트를 위해 가짜를 통과 할 수 있습니다. 여기서 원하는 시간에 가짜를 설정할 수 있습니다.

그러나 시스템을 주도하는 모든 것을 조롱해야합니다. 특정 시간을 명시 적으로 기다리고 있습니까? 아니면 다른 것이 코드를 호출합니까?

다른 팁

Java에 대해 물었 기 때문에 사과해야합니다. Java와 관련하여 점심을 먹으러 나가지 만 DateTime 객체를 조롱하고 원하는 시간 동안 설정하는 것입니다.

.NET에서는 다음과 같이 보입니다.

public static class SystemTime
{
    public static Func<DateTime> Now = () => DateTime.Now;
}

SystemTime.Now = () => new DateTime(2000,1,1);

에서: 테스트에서 시간을 다루는 것


... [a] n Alarm Clock 프로그램은 특정 시간에 종소리가 울리면 외부 세계에서 현재 시간을 얻을 수 있습니다. 이것을 테스트하려면 테스트는 알람 시간이 될 때까지 기다려야 종을 올바르게 묶었는지 여부를 알 수 있습니다. 실제 객체 대신 모의 객체를 사용하는 경우 알람 클록 프로그램을 분리하여 테스트 할 수 있도록 벨 링 시간 (실제로 그 시간이든 아니든)을 제공하도록 프로그래밍 할 수 있습니다.

당신이 참조하는이 알람 시계는 객체를 조롱하는 예를 제공합니다. 실제로 모의 프레임 워크에서 사용할 수있는 객체가 아닙니다.

기본적으로 테스트에서하는 일은 가짜 시계 이벤트입니다. 정확히 디자인에 어떻게 의존하는지, 그리고 이벤트를 기다리는 방법이지만, 이벤트를 간단하게 유지하려면 (순수하지 않은 경우) 내 접근 방식은 시간 이벤트가 트리거 될 때 호출되는 방법을 갖는 것입니다. 그것의.

먼저 방법을 호출하고 시간이 정한 이벤트가 기대하는 것을 테스트하는 것입니다. 그런 다음 해당 클래스를 조롱합니다 (Jmock과 함께 선호하는 방법은 인터페이스를 만들고 호출 방법이 해당 인터페이스를 구현하는 것입니다).

그런 다음 타이밍을 처리하는 수업에 모의를 전달합니다. 여기서 다시, 나는 스레딩/트리거링 문제 (예 : 시스템 시계 확인 및 스레드 시작과 같은)를 추상화하고 본질적으로 이벤트를 바로 실행하는 모의 반환 값을 갖게됩니다.

그런 다음 실제로 시스템 시계를 읽고 가능한 한 작은 스레드를 시작하는 실제 코드를 유지하면 단위 테스트중인 영역이 될 것입니다.

조롱은 단위 테스트와 관련이 있습니다. 설명하는 기능의 경우 트리거 (귀하의 경우 Alarm Clock Event)를 프로세스 ( '일상적인 일상'하는 것이 무엇이든)와 프로세스 기능을 단위 테스트합니다.

그런 다음 프로세스 기능을 호출 할 스케줄링 코드에주의를 기울이십시오. 나는 같은 것을 사용하는 것이 좋습니다 석영 이것을 위해서는하지만 당신은 갈 것입니다 역할 시스템 시계의 현재 값을 기준으로 트리거 시간을 할당하면 테스트 할 모든 것이 트리거 이벤트가 발생한다는 점에서 트리거 시간을 할당하면 실제 시스템 시계와 함께 작동 할 수 있습니다.

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