2017-10-04 2 views
-1

J'ai une classe comme ceci:Mockito fonction java simulée avec méthode interne

@Component 
    public class AddressConverter { 

     public Function<Address, AddressDTO> convertToDTO = new Function<Address, AddressDTO>() { 
      public AddressDTO apply(Address address) { 
       AddressDTO dto = new AddressDTO(); 
       dto.setAddress1(address.getAddress1()); 
       dto.setAddress2(address.getAddress2()); 
       dto.setCity(address.getCity()); 
       dto.setState(address.getState()); 
       dto.setZip(address.getZip()); 
       dto.setZip4(address.getZip4()); 
       return dto; 
      } 
     }; 
} 

J'ai une autre classe qui utilise comme ceci:

 @Component 
      public class ProfileConverter { 

       @Autowired 
       private AddressConverter addressConverter; 

       public Function<Profile, ProfileDTO> convertToDTO = new Function<Profile, ProfileDTO>() { 
        public ProfileDTO apply(Profile profile) { 
         ProfileDTO dto = new ProfileDTO(); 
     dto.setEmployeeAddress(addressConverter.convertToDTO.apply(profile.getEmployeeAddress())); 
return dto; 
        } 
       }; 
    } 

Je suis en train de se moquer de la classe addressConverter comme :

EDIT: HERE IS THE TEST CLASS 

public class ProfileConverterTest { 

    ProfileConverter converter; 
    AddressConverter addressConverter; 
    Profile profile; 
    ProfileDTO dto; 
    Address address; 
    AddressDTO addressDTO; 

    @Before 
    public void setUp() { 
     converter = new ProfileConverter(); 
     addressConverter = Mockito.mock(AddressConverter.class); 
     profile = new Profile(); 
     profile.setProfileId(123L); 
     dto = new ProfileDTO(); 
     Mockito.when(addressConverter.convertFromDTO.apply(addressDTO)).thenReturn(address); 
     Mockito.when(addressConverter.convertToDTO.apply(address)).thenReturn(addressDTO); 
     ReflectionTestUtils.setField(converter, "addressConverter", addressConverter); 
     address = new Address("1","2","3","4","5","6"); 
     address.setAddressId(123L); 
     addressDTO = new AddressDTO("hash","1","2","3","4","5","6"); 
    } 

    @Test 
    public void applyReturnsProfileDTO() throws Exception { 
     ProfileDTO result = converter.convertToDTO.apply(profile); 
assertEquals(result.getEmployeeAddress().getAddress1(), profile.getEmployeeAddress().getAddress1()); 
} 
} 

Je continue à obtenir un NullPointerException dans mon test sur la première ligne Mockito.when. Je pense qu'il est provoqué par la fausse classe addressConverter appelant une fonction appelant une méthode interne. La fonction peut être nulle?

+0

Dans quelle ligne avez-vous les NPE? Pourriez-vous fournir votre méthode de test telle quelle? Question plus générique est: pourquoi vous essayez de se moquer d'une classe qui est assez simple? –

+0

Les questions qui cherchent une aide au débogage ("pourquoi ce code ne fonctionne-t-il pas?") Doivent inclure le comportement souhaité, un problème ou une erreur spécifique et le code le plus court nécessaire pour le reproduire dans la question elle-même. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: Comment créer un [mcve]. Utilisez le lien "modifier" pour améliorer votre * question * - ne pas ajouter plus d'informations via des commentaires. Merci! – GhostCat

+0

Comment sommes-nous censés savoir ce que fait votre test lorsque vous en omettez toutes les parties importantes? – GhostCat

Répondre

1

Vous attendez Mockito appeler votre constructeur de classe qui initialise le champ convertToDTO: ce n'est pas le cas, et le test simple ici le démontrer:

@Test 
    public void test_that_yeepee_works() { 
    final Yeepee y = Mockito.mock(Yeepee.class);  
    Assertions.assertNotNull(y.myObject); // fails. 
    } 

    public static class Yeepee { 
    public Object myObject = new Object(); 
    } 

Vous pouvez essayer Mockito.spy à la place.

Ou vous devez faire explicitement:

converter = new ProfileConverter(); 
addressConverter = Mockito.mock(AddressConverter.class); 
addressConverter.convertToDTO = (Function<Address, AddressDTO>) Mockito.mock(Function.class); 

Si vous utilisez getters, Mockito aurait pu le faire pour vous en utilisant des simulacres intelligents.

+0

Merci @NoDataFound – blong824

0

Je pense que NPE est parce que vous n'avez pas créé de maquette pour la classe AddressConverter. Vous devriez écrire quelque chose comme ci-dessous:

AddressConverter addressConverter = Mockito.mock(AddressConverter.class); 
Mockito.when(addressConverter.apply(any(Address.class))).thenReturn(addressDTO); 

Note: tout (Address.class) correspond à tout objet de Address classe. Si vous voulez tester la météo, votre objet adresse est utilisé lors de l'appel de la méthode d'application, allez-y et ajoutez l'implémentation hashcode() et equals() dans votre classe Address.

+1

Non compilable, 'apply()' appartient à Function, pas 'AddressConverter'. –