Я пытаюсь смоделировать мой 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);