2016-12-30 2 views
0

Ich habe eine Conrtoller-Klasse, in der ich Details über aktuell angemeldeten Benutzer erhalte. Der Methodenname ist 'LoggedInUser()'. Die Methode läuft im Allgemeinen einwandfrei, aber ich kann keinen Einheitentestfall für eine bestimmte Methode erstellen.Mockito.when() funktioniert nicht richtig beim Spotten von Autowired-Objekt

Zum Testen verwende ich Mockito, aber 'Mockito.when()' funktioniert nicht richtig. Ich ging durch alle verwandten Fragen, aber nicht in der Lage, es zu lösen.

Folgendes ist, was ich bisher gemacht habe.

Controller.java

@Service 
    @Transactional 
    Public class Controller implements someInterface { 

private LoggedInUser getUser(HttpServletRequest request) { 
      principal = request.getUserPrincipal(); 
      Authentication tk = (Authentication) principal; 
      //Authentication tk = (Authentication)(request.getUserPrincipal()); 
      LoggedInUser user = (LoggedInUser) tk.getPrincipal(); 
      return user; 
     } 

Die Zeile in Kommentar geschrieben, weil ich in einem anderen Beitrag gelesen, dass es nicht als ‚Haupt‘ arbeiten kann wieder instanziiert wird. Also habe ich versucht, es zu umgehen, aber das hat nicht so gut funktioniert.

Test.java

@Mock 
    private HttpServletRequest httpServletRequest; 

public void tes() { 
     //httpServletRequest = Mockito.mock(HttpServletRequest.class); 
     Principal principal= Mockito.mock(Principal.class); 
     Mockito.when(httpServletRequest.getUserPrincipal()).thenReturn(principal); 
....... 
....... 
} 

Während des Debuggens, erhalte ich Wert für request (object of HttpServletRequest) wie es in Controller-Klasse Autowired ist aber principal ist immer null. Jede Hilfe wird geschätzt !!

+0

Kommentar- der 1 Zeile in 'tes()' – ppasler

+0

Ihre Mock Wirkung nicht, wenn die Referenz, die Sie zu spotten haben ist nicht belegt mit dem Wert des Scheines. Sie sollten den Code der getesteten Methode anzeigen. – davidxxx

+0

Stellen Sie eine [mcve] bereit. – Tom

Antwort

0

Ich konnte HttpServletRequest nicht vortäuschen, weil es Autowired ist und dadurch request.getUserPrincipal() bleibt immer Null, da es niemals die Methode mock() aufruft. Ich ersetzte den Code in folgender Weise, es funktionierte !!

Controller.java

@Service 
    @Transactional 
    Public class Controller implements someInterface { 

    public LoggedInUser getUser() { 
     LoggedInUser user = (LoggedInUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
     return user; 
    } 

Test.java

@Mock 
    private Principal principal; 

    @Mock 
    private SecurityContext securitycontext; 

    @Mock 
    private Authentication authentication; 
    public void test() { 
     LoggedInUser user = new LoggedInUser(); 
     Mockito.when(authentication.getPrincipal()).thenReturn(user); 
     Mockito.when(securitycontext.getAuthentication()).thenReturn(authentication); 
     SecurityContextHolder.setContext(securitycontext); 
....... 
....... 
} 
0

Sie haben Ihr verspottetes Objekt httpServletRequest nicht eingespritzt. Sie müssen dieses verspottete Objekt zum Testen an Ihre getUser-Methode übergeben.

+0

und wie genau kann ich das tun? –

+0

Wenn Ihre Methode nicht privat ist, können Sie 'getUser (httpServletRequest) 'aufrufen, nachdem Sie sie verspottet haben' httpServletRequest = Mockito.mock (HttpServletRequest.class); '. Sie müssen sehen, wo dies an Ihr Servlet übergeben wird. –

+0

Während des Debuggen, bekomme ich Wert für 'request (Objekt von HttpServletRequest)', da es in der Controller-Klasse Autowired ist, aber 'Prinzipal 'immer Null ist. –

2

Haben Sie in dieser Testklasse @RunWith(MockitoJUnitRunner.class) hinzugefügt? Denn nur dann funktioniert @Mock. Ich gehe davon aus, dass Sie HttpServletRequest auf getUser() verspottet weitergeben.

+0

nicht. Ich habe hinzugefügt 'MockitoAnnotations.initMocks (this)' –

+0

Ja, das wird auch Ihre Mocks init. – zodi91

+0

Können Sie das vollständige Beispiel angeben? – zodi91

Verwandte Themen