Mockito - NullPointerException - PullRequest
       10

Mockito - NullPointerException

0 голосов
/ 05 марта 2020

Я пытаюсь смоделировать мой AddressService с помощью JUnit с Mockito, тестируемый класс выглядит примерно так:

    @Autowired
    private AddressDataManager addressDataManager;

    /**
     * Delegate AddressDataManager to add an individual Address object
     * @param address
     * @return Address object
     */
    public Address addAddress(Address address) {
        return this.addressDataManager.addAddress(address);
    }

, который затем вызывает JPA-репозиторий;

     /**
     * Create a new Address
     * 
     * @param address
     * @return JSON representation of an Address object
     */
    public Address addAddress(Address address) {
        addressRepo.save(address);
        return address;
    }

Эта проблема заключается в том, что я получаю NullPointerException при попытке создать объект результата Address с помощью addAddress, который вызывает вызов метода save() в моем классе addressService. Кажется, он не возвращает объект адреса, когда я отправляю объект адреса ему.

Я пытался;

  • создать конструктор с AddressRepository и AddressDataManager в AddressManager
  • Как ни странно, он работает нормально, когда я удаляю @Mock addressRepository и AddressDataManager из класса и вместо него используйте AddressManager в качестве @Mock (вместо @InjectMocks). Но я не уверен, что это правильный подход, так как некоторые методы в AddressManager напрямую используют AddressRepository, поэтому он также должен создать NPE.

Мой Mockito тестовый код:

@RunWith(MockitoJUnitRunner.class) 
public class AddressServiceTest {

    @Mock
    private AddressRepository addressRepo;

    @Mock
    private AddressDataManager addressDataManager;

    @InjectMocks
    private AddressManager addressService;

    public Address createTestData() {
        /** Create an Address **/
        Address mockAddress = new Address();
        /** Set fields **/
        mockAddress.setId((long) 1);
        mockAddress.setStreet("A Street");
        // ...
        return mockAddress;
    }

    /**
     * Test the addressService addAddress and addessRepo save method
     */
    @Test
    public void addAddressTest() {
        Address mockAddress = createTestData();
        /** Test the return type of save is indeed `Address` **/
        when(addressRepo.save(mockAddress)).thenReturn(mockAddress);    
        /** Create a returning result object to test addAddress method return **/
        Address addResult = addressService.addAddress(mockAddress); // NullPointerException here
        /** Check values are equal to address object **/
        assertEquals(Long.valueOf(1), addResult.getId());
        assertEquals("A Street", addResult.getStreet());
        // ...
        /** Verify that addressRepo save was called once using Mockito **/
        verify(addressRepo, times(1)).save(addResult); 
        verify(addressService, times(1)).addAddress(addResult);
    }

Я чувствую, что я рядом, может, у меня неправильный тег над неправильным классом? Как я уже сказал, это работало хорошо, когда я просто использовал его так:

@Mock
private AddressManager addressService;

/** Test the return type of addAddress is indeed `Address` **/
when(addressService.addAddress(mockAddress)).thenReturn(mockAddress);   
/** Verify that addressService addAddress was called once using Mockito **/
verify(addressService , times(1)).addAddress(addResult); 

...