I am trying to mock my AddressService
using JUnit with Mockito
, the class under test looks a bit like this;
@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);
}
Which then calls a JPA repository;
/**
* Create a new Address
*
* @param address
* @return JSON representation of an Address object
*/
public Address addAddress(Address address) {
addressRepo.save(address);
return address;
}
This issue is that I am getting a NullPointerException
, when trying to create an Address result object using addAddress
, which invokes the save()
repository method call in my addressService
class. It seems to be not returning the address object when I send an address object to it.
I have tried to;
- create a constructor with the
AddressRepository
andAddressDataManager
inAddressManager
- Strangely, it works fine when I remove the
@Mock
addressRepository
andAddressDataManager
from the class and instead useAddressManager
as the@Mock
(instead of@InjectMocks
). But I'm not sure that is the correct approach as some methods inAddressManager
directly use theAddressRepository
, so it should also create a NPE.
My Mockito
test code:
@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);
}
I feel like I am close, maybe I have the wrong tag over the wrong class? As I said, it worked well when I just used it like so;
@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);