2014-12-22 9 views
1

데이터베이스에 내 비즈니스 오브젝트를 삽입 할 때 (스프링/최대 절전 모드 사용) 현재 날짜로 업데이트되는 일부 날짜 필드가 있습니다.BDD에서 반복 가능한 날짜 테스트를 어떻게 만들 수 있습니까?

이것은 중요한 기능이므로 테스트 가능한 사양에서 유효성을 검사하고 싶습니다.

문제는 정확한 날짜로 필드를보고 싶지만 현재 날짜이므로 항상 변경됩니다.

나는 작동 할 수있는 솔루션을 가지고 있지만, 너무 양질이어서 양심대로 할 수 없다.

@Service 
public class DateService { 
    private Date fixedDate; 

    public Date getCurrentDate() { 
    if (fixedDate != null) 
     return fixedDate; 
    return new Date(); 
    } 

    // setter/reset 
} 

을 그리고 난() 나는 새로운 일을 필요로 그것을마다 @Autowired :

은 다음과 같이 될 것이다. 그런 다음, 테스트 시간이되면, 나는 모든 "새로운"날짜가이 날짜가 될 것임을 알기 때문에 날짜를 수정합니다.

프로젝트에서 반복 가능한 날짜 기반 테스트를 어떻게 작성합니까?

감사

답변

1

당신이 다른 시계 구현이 잘 작동 주입, 기본 시스템을 변경할 수 있습니다 때. 예를 들어 this answer은 Java 8의 java.time.Clock 인터페이스를 비롯한 다양한 솔루션을 보여줍니다. 당신이 실제 구현을 테스트 할 시스템 테스트, 악기

Concordion 사양 등 :

<p>The invoice date is set to <span c:assertEquals=getInvoiceDate()>today</span></p>

반환이 포함 된 고정 방법에서 문자열 값 중 하나를

  • 오늘이 오늘 인 경우
  • 오늘 날짜가 아닌 경우 형식이 지정된 날짜입니다. 그러면 Concordion 출력에 20/12/2014로 표시됩니다.

참고 :이 방법을 사용하면 날짜를 검색하고 테스트하는 사이에 날짜가 변경 될 위험이 있으므로이 방법을 사용하면 자정에 걸쳐 테스트를 실행하는 데주의해야합니다.

1

나는 다음과 같은 방식으로 접근합니다 :

테스트 클라이언트에서
  1. , 내가 현재 날짜를 캡처하고 변수
  2. 내가 다음 서비스를 호출 할에 저장할 것 (서비스는 현재 날짜를 가져와 모델을 업데이트해야 함)
  3. 그러면 모델의 관련 부분을 얻기 위해 서비스를 호출합니다 (R CRUD에서). 나는 모델 표현이 날짜를 비교하기 위해 나는 다음 주장을 작성합니다
  4. 날짜와 필드 포함되어 있다고 가정 것이다 : 나는 테스트 클라이언트에있어 하나는 서비스에 의해 설정된 하나를
0

프로덕션 환경에서 테스트 코드가 발생하지 않도록 테스트에서 DateService를 대체하기 위해 mock/stub 프레임 워크를 사용하는 것이 좋습니다. 예를 들어, 고정 된 날짜를 반환 DateService의 테스트 인스턴스를 만들 수 Mockito (https://github.com/mockito/mockito)를 사용할 수 있습니다 경우

Date fixedDate = new Date(); //use any settings you need for your test 
DateService mockedDateService = mock(DateService.class); 
when(mockedDateService.getCurrentDate()).thenReturn(fixedDate);