2017-03-21 3 views
0
nicht verspotten

Dies ist die Testklasse:Warum diese Mockito nicht

@MockBean 
private UserRepository userRepository; 

@Before 
public void beforeClass() { 
    String mobile; 
    when(this.userRepository.findByMobile(Mockito.anyString())).thenAnswer(new Answer<User>() { 
     @Override 
     public User answer(InvocationOnMock invocation) throws Throwable { 
      Object[] args = invocation.getArguments(); 
      return MockData.getUserByMobile((String) args[0]); 
     } 
    }); 
} 

@Test 
@WithUserDetails(value = MockData.CUSTOMER_USERNAME, userDetailsServiceBeanName = "customizedUserDetailsService") 
public void testAdd() throws Exception {} 

Und das ist die userDetails Umsetzung:

@Autowired 
private UserRepository userRepository; 

@Override 
@Transactional 
public UserDetails loadUserByUsername(String username) { 
    User user = (User) userRepository.findByMobile(username); // user is always null 

Was ich erwarte, ist, wenn userRepository.findByMobile genannt wird, sollte es die getUserByMobile nennen Methode definiert in @Before. Aber offensichtlich funktioniert die Mockito Konfiguration nicht oder userRepository nicht zu spotten. Was ist falsch und wie löst man es?

Antwort

2

UserRepository wird in der userDetails-Implementierung verwendet und muss in userDetails wie in this beschrieben eingefügt werden. Da sich jedoch XXRepository in der Schnittstelle befindet, kann @InjectedMock nicht verwendet werden. Dann Klassen werden: Prüfklasse:

@MockBean 
    private UserService userService; 

    @InjectMocks 
    private CustomizedUserDetailsService customizedUserDetailsService; 

    @Before 
    public void before() { 
     MockitoAnnotations.initMocks(this); 
     when(this.userService.findByMobile(Mockito.anyString())).thenAnswer(new Answer<User>() { 
      @Override 
      public User answer(InvocationOnMock invocation) throws Throwable { 
       Object[] args = invocation.getArguments(); 
       return MockData.getUserByMobile((String) args[0]); 
      } 
     }); 
    } 

    @Test 
    @WithUserDetails(value = MockData.CUSTOMER_USERNAME, userDetailsServiceBeanName = "customizedUserDetailsService") {} 

Und Userdetails:

@Autowired 
private UserService userService; 

@Override 
@Transactional 
public UserDetails loadUserByUsername(String username) { 
    User user = (User) userService.findByMobile(username); 

Ich kann sehen, dass der Userservice in Userdetails der gleiche Userservice in Testklasse verspottete ist jedoch @Before Verfahren nach den @WithUserDetails userDetails genannt werden . Um endlich das Laden von MockData-Usern zu erreichen, muss ich wohl noch ein userDetails nur für UT erstellen. EDIT 2: Eigentlich habe ich es ohne @InjectMocks ausprobiert und benutze userService (ursprünglich benutzte ich userRepository), es funktioniert auch.