2008-10-23 2 views
0

저는 jmock을 처음 사용하고 HttpSession을 모의하려고합니다. 나는 점점 오전 :Jmock을 HttpSession 및 HttpServletRequest와 함께 사용하는 방법

에 java.lang.AssertionError를 : 예기치 않은 호출 : httpServletRequest.getSession() 을 아무 기대 지정된 : 당신은 ... 는 않았다 - 카디널리티 절과 기대를 시작하는 것을 잊지? - mocked 메서드를 호출하여 기대하는 매개 변수를 지정 하시겠습니까?

시험 방법 :

@Test

public void testDoAuthorization(){ 

    final HttpServletRequest request = context.mock(HttpServletRequest.class); 
    final HttpSession session = request.getSession(); 

    context.checking(new Expectations(){{ 
     one(request).getSession(true); will(returnValue(session)); 
    }}); 

    assertTrue(dwnLoadCel.doAuthorization(session)); 
} 

내가 검색을 조금 짓을하고이 작업이 여전히 어떻게 나에게 분명하지 않다. 내가 작은 조각을 놓치고있는 것처럼 느껴진다. 이 경험을 가진 사람은 올바른 방향으로 나를 가리킬 수 있습니다. 감사합니다.

답변

2

요청 개체를 조롱 할 필요가 없습니다. 테스트중인 메소드 (dwnLoadCel.doAuthorization())는 HttpSession 오브젝트에만 의존하므로 모의해야합니다. 그래서 코드는 다음과 같습니다

public void testDoAuthorization(){ 
    final HttpSession session = context.mock(HttpSession.class); 

    context.checking(new Expectations(){{ 
     // ??? 
    }}); 

    assertTrue(dwnLoadCel.doAuthorization(session)); 

}

문제가됩니다 : 당신이 무엇을 기대 실제로 세션 개체와을 할 수있는 SUT? session에 대한 호출과 doAuthorization을 반환하는 것으로 가정되는 해당 반환 값을 예상대로 표현해야합니다. true.

+0

올바른 방향으로 나를 도왔습니다. httpssession을 사용하고 hamcrest 버전을 업그레이드해야했습니다. – SWD

1

실제로 JMock 컨텍스트를 호출하여 실제로 호출하기 전에 메서드 호출 횟수를 예상해야한다고 생각합니다. 내가 JMock 슈퍼 익숙하지 않아요하지만 dwnLoadCel 단위 테스트에서 실제로 상관 할

final HttpServletRequest request = context.mock(HttpServletRequest.class); 

context.checking(new Expectations(){{ 
    one(request).getSession(true); will(returnValue(session)); 
}}); 

final HttpSession session = request.getSession(); 

얼마나 많은 시간을 특정 조롱 객체의 메소드를 호출? 아니면 실제 세션없이 HttpSession에 의존하는 클래스를 테스트하려고합니까? 그것이 후자 인 경우 JMock은 당신에게 과잉이라고 생각합니다.

단위 테스트 (스텁)를 위해 HttpSession 인터페이스를 구현하는 클래스를 만들고 테스트를 실행하거나, dwnLoadCel을 살펴보고 의 경우 실제로는에 HttpSession에 대한 참조가 있거나 HttpSession 내의 일부 속성 만 있으면됩니다. Refactor dwnLoadCel은 실제로 필요한 것 (Map 또는 Session 객체 내의 특정 매개 변수 값)에만 의존해야합니다. 이렇게하면 유닛 테스트가 더 쉬워집니다 (서블릿 컨테이너에 대한 종속성은 bye-bye가됩니다).

난 당신이 이미 테스트중인 클래스의 종속성 주입의 수준을 가지고 있다고 생각하지만 너무 넓은 개체에 의존 수도 있습니다. The Google Test Blog에는 DI에 a lotof excellentarticles이 있었고, 요즘은 유용하다고 생각할 수도 있습니다.

+0

좋은 답변입니다. 문제를 검토 한 후에 dwnLoadCel이 doAuthorization에 사용하는 클래스를 살펴 보는 것이 합리적입니다. 어쩌면 리팩토링이 옵션 일 수 있습니다. – SWD

+0

기록을 위해 효과적으로 호출을 스텁하는 jMock의 'allows()'절이 있습니다. 원하는만큼 전화를 걸 수 있습니다.일반적으로 공동 작업자의 상태를 변경하지 않는 쿼리는 '허용'합니다. –

관련 문제