2013-01-08 73 views
0

我在一个Java EE下面的代码托管bean:的JUnit测试FacesContext.getExternalContext

FacesContext context = facesContextProvider.getCurrentInstance(); 
HttpServletResponse response = (HttpServletResponse) context.getExternalContext(); 

哪里facesContextProvider是返回faces上下文(用于模拟测试非常有用)的自定义类。

我想知道如何在使用mockito的JUnit中进行测试。我正试着组合:

FacesContextProvider mockFacesContextProvider = mock(FacesContextProvider.class); 
when(mockFacesContextProvider.getCurrentInstance()).thenReturn(mockFacesContext); 
// this line is wrong ~> when(mockFacesContext.getExternalContext()).thenReturn((ExternalContext) new MockHttpServletResponse()); 

如何注入某种模拟或自定义HttpServletResponse到我的外部上下文中?

感谢您的帮助。

ANSWER

我的控制器代码是错误的。您可以使用ExternalContext来执行您所需的任何操作。因此,在控制器,它实际上应该是:

FacesContext facesContext = facesContextProvider.getCurrentInstance(); 
ExternalContext externalContext = facesContext.getExternalContext(); 
externalContext.responseReset(); 

如果你还想要回应,你可以得到它:

HttpResponse response = externalContext.getResponse(); 

然后将单元测试工具是:

mockFacesContextProvider = mock(FacesContextProvider.class); 
mockFacesContext = mock(FacesContext.class); 
mockExternalContext = mock(ExternalContext.class); 
mockHttpSession = mock(HttpSession.class); 
when(mockFacesContextProvider.getCurrentInstance()).thenReturn(mockFacesContext); 
when(mockFacesContext.getExternalContext()).thenReturn(mockExternalContext); 
when(mockExternalContext.getSession(true)).thenReturn(mockHttpSession); 

然后单元测试代码将是:

verify(mockExternalContext).responseReset(); 
+1

我不能模拟ExternalContext.class,因为它是抽象的......你是怎么做到的? – karmapolice

回答

0
FacesContextProvider mockFacesContextProvider = mock(FacesContextProvider.class); 
HttpServletResponse mockResponse = mock(HttpServletResponse.class); 
when(mockFacesContextProvider.getCurrentInstance()).thenReturn(mockFacesContext); 
when(mockFacesContext.getExternalContext()).thenReturn(mockResponse);  
+0

感谢您的答案。我也尝试过这个失败。它实际上会是HttpServletResponse mockResponse = mock(HttpServletResponse.class);当(mockFacesContext.getExternalContext())。然后返回((ExternalContext)mockResponse),但是,这会抛出一个类抛出异常 – dev

+0

我有点困惑。 ExternalContext是HttpServletResponse的子类吗?如果是这样,我认为你不需要原始代码中的演员;你也需要模拟'ExternalContext',而不是'HttpServletResponse'。 –

+0

是的,就是这样。我会更新原始问题,并在您获得答案后向您提供答案。 – dev