2015-01-06 4 views
2

단위 테스트를 시작했지만 여전히 테스트 방법을 모릅니다. 내 응용 프로그램은 2 params, 공연장의 개장과 닫는 시간을 받고 현재 시간에 공연장이 열려 있으면 true를 반환하고 그렇지 않으면 false를 반환하는 메서드가 있습니다. 내부적으로이 메서드는 을 사용하여 현재 시간을 가져옵니다. 이 메서드를 제대로 테스트하려면 Calendar 클래스에서 원하는 설정 시간을 반환 할 수 있습니까? Microsoft Fake 프레임 워크에는 시스템 클래스의 반환 값을 가짜로 만드는 shims이라는 것이 있습니다. Robolectric 프레임 워크에서 유사한 기술을 알고 있습니까?Robolectric : 캘린더 클래스가 반환 할 시간을 어떻게 설정할 수 있습니까?

+0

해결 방법을 찾으셨습니까? 우리는 같은 문제를 겪고 있습니다. –

답변

3

Robolectric은 프레임 워크 클래스 중 일부를 소위 그림자 클래스로 바꿉니다. 이러한 클래스는 원래 프레임 워크 클래스를 사용하는 코드를 테스트하기 위해 해당 동작을 지정할 수있는 경우가 많습니다.

이 경우, 찾고있는 그림자 클래스는 Calendar에서 사용하는 currentTimeMillis()의 반환 값을 지정하는 데 사용할 수있는 setCurrentTimeMillis()가있는 ShadowSystemClock입니다. 의 라인을 따라

뭔가 :

ShadowSystemClock shadowClock = Robolectric.shadowOf(SystemClock.class); 
shadowClock.setCurrentTimeMillis(1424369871446); // 18:17:51 UTC Feb 19 2015 

당신을 위해 작동합니다.

편집 : 그들은 지금 정적으로 이제 ShadowSystemClock의 방법은 직접 액세스 할 수

. 시간을 설정하는 업데이트 방법은 다음과 같습니다이 문제에 인용

ShadowSystemClock.setCurrentTimeMillis(1424369871446); // 18:17:51 UTC Feb 19 2015 

-Calls to java.lang.System are not intercepted in Robolectric

위의 코드의 효과가 같은 다른 방법에 분명하다 : 현재로

ShadowSystemClock.currentTimeMillis(); 
SystemClock.currentThreadTimeMillis(); 

이제 위와 연결된 문제의 상태가 변경 될 때까지 System.currentTimeMillis()의 응답을 조롱하는 간단한 방법은 없습니다. 내가 무슨 짓을

+0

Roboeletric 3.0에서 어떻게 사용합니까? –

+0

'ShadowSystemClock.setCurrentTimeMillis (1424369871446);'. 모든 메소드는 정적입니다. –

+0

@Edward @KamranAhmed, 이것은 나를 위해 작동하지 않습니다. 'ShadowSystemClock.setCurrentTimeMillis (1424369871446);을 설정 한 다음'Calendar.getInstance(). getTimeInMillis()'를 호출하면 실시간을 반환합니다. 누구든지 나를 도울 수 있을까? – AinisSK

0

이었다 다음 : link

가 그럼 난과 같이 오늘 (날짜)를 반환하는 방법을 조롱 :

먼저이 게시물처럼 날짜와 상호 작용을 래핑하는 클래스를 생성 Mockito :

public void setMockDate(String mockDateString) { 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
try { 
    Date mockDate = sdf.parse(mockDateString); 
    stub(mockDateProvider.getToday()).toReturn(mockDate); 
} catch (ParseException parseException) { 
    fail("Failure: Unable to parse test date string"); 
}} 

그러면 메소드가 반환 할 날짜를 지정할 수 있습니다.

다른 사람들에게 도움이되기를 바랍니다.

관련 문제