2017-06-21 2 views
1

Ich habe ContextListener die injizieren in ServletContext Objekt für die Arbeit mit der Datenbank. Und das DBJoint Objekt erstellen in Verfahren, die Test:Wie man Objekte mockt, die innerhalb der Testmethode entstehen?

@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); 
    } 
} 

Zum Testen servletContext.setAttribute("db", joint); I DBJoint joint für Senden in setAttribute benötigen.

Mein Test:

@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. Testing für servletContext.setAttribute("db", joint); ist möglicherweise?
  2. Wenn die Antwort "Ja", wie.

Vielen Dank.

+1

Ihre bereits wissen, wie diese Klassen zu verspotten. Ich denke, was Sie brauchen, ist 'org.mockito.ArgumentCaptor;', wo Sie die DBJoint-Menge "servletContext.setAttribute (" db ", joint); Sobald Sie das "gemeinsame" Objekt erhalten haben, können Sie es überprüfen. Hofft diese Hilfe. –

+0

Ja, schauen Sie in 'org.mockito.ArgumentCaptor' – liminal

+0

Upvoting hier - nur um meine Wertschätzung für Ihre Einstellung auszudrücken! Und was ich zu der anderen Frage sagen wollte: Es war schön geschrieben - aber nächstes Mal: ​​Führe die Ausnahmebotschaft über eine Suchmaschine aus, bevor du eine Frage stellst. Das kann dir viel Zeit sparen. – GhostCat

Antwort

1

Zuerst müssen Sie verstehen, dass Ihr Objekt ein verspottetes Objekt und kein reales Objekt ist. Das Objekt joint ist echt und Sie müssen nicht spotten. Sie können möglicherweise Test servletContext.setAttribute("db", joint); mit Mockito überprüfen

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

Sie können den Konstruktor mit Power-Mock imitieren. Versuchen Sie diese

DBJointHandler Gelenk = neue DBJointHandler ("Datenbank_Scripts", "Authentifizierung_database"); versuchen { PowerMockito.whenNew (DBJointHandler.class) .withArguments ("Datenbank_Scripts", "Authentifizierung_Datenbank"). ThereReturn (Joint); } catch (Ausnahme e) { // TODO Automatisch generierter Catch-Block e.printStackTrace(); }

Verwandte Themen