2017-06-21 149 views
1

我有ContextListener注入ServletContext對象與數據庫工作。這DBJoint對象創建方法,該方法測試:如何模擬在測試方法內創建的對象?

@WebListener 
public class ContextListener implements ServletContextListener { 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 

     final ServletContext servletContext = 
       servletContextEvent.getServletContext(); 

     final DBJoint joint = new DBJointHandler(
       "database_scripts", "authentication_database"); 

     servletContext.setAttribute("db", joint); 
    } 
} 

爲了測試servletContext.setAttribute("db", joint);我需要DBJoint jointsetAttribute發送。

我的測試:

@Test 
public void whenThen() { 

    final ServletContextEvent event = mock(ServletContextEvent.class); 
    final ServletContext context = mock(ServletContext.class); 
    when(event.getServletContext()).thenReturn(context); 

    final ContextListener listener = new ContextListener(); 
    listener.contextInitialized(event); 
    DBJoint joint = ..?// how to mocking this? 
    verify(context).setAttribute("db", joint); 
} 
  1. 測試爲servletContext.setAttribute("db", joint);可能是?
  2. 如果回答「是」,如何。

謝謝。

+1

你已經知道如何模擬這些類。我認爲你需要的是'org.mockito.ArgumentCaptor';'你想要「捕獲」由servletContext.setAttribute(「db」,joint);'設置的DBJoint。一旦你得到了「聯合」對象,那麼你可以驗證它。希望這有助於。 –

+0

是的,看看'org.mockito.ArgumentCaptor' – liminal

+0

Upvoting here - 只是爲了表達我對你的態度的讚賞!我想就另一個問題說些什麼:它寫得很好 - 但下一次:在提出問題之前通過搜索引擎運行例外消息。這可以讓你安心很多時間。 – GhostCat

回答

1

首先,您需要明白,您的servletContext對象是一個模擬對象而不是真實對象。 joint對象是真實的,你不需要模擬。 你可以測試servletContext.setAttribute("db", joint);使用mockito驗證

verify(servletContext).setAttribute(eq("db"), any(DBJoint.class)); 
1

你可以通過使用功率模擬來模擬構造函數。試試這個

DBJointHandler joint = new DBJointHandler(「database_scripts」,「authentication_database」); 嘗試PowerMockito.whenNew(DBJointHandler.class).withArguments(「database_scripts」,「authentication_database」)。然後返回(聯合); (例外e){TODO自動生成的catch塊 e.printStackTrace(); }