Trato de hacer una prueba unitaria para el método getPersonsFromAddress () en mi servicio, trato de burlarse del modelo de objetos, pero cuando ejecuto la prueba de una NullPointerException aparece en el servicio cuando model.getPersons () se llama.
Aquí está mi servicio con el método getPersonsFromAddress ():
@Service
public class ChildAlertService {
@Autowired
private Model model;
@Autowired
private Util util;
public List<Person> getPersonsFromAdress (String address) {
List<Person> listPersons = model.getPersons();
List<Person> listPersonsFromAddress = new ArrayList<>();
for (Person person : listPersons) {
if(person.getAddress().contains(address)) {
listPersonsFromAddress.add(person);
}
}
return listPersonsFromAddress;
}
Aquí está mi prueba:
@ExtendWith(MockitoExtension.class)
public class ChildAlertServiceTest {
private static ChildAlertService childAlertService;
@Mock
private Model model;
@BeforeAll
private static void setUp() {
childAlertService = new ChildAlertService();
}
@Test
public void testGetPersonsFromAdress () {
List<Person> listPersons = new ArrayList<>();
Person person1 = new Person();
person1.setFirstName("John");
person1.setFirstName("Boyd");
person1.setAddress("1509 Culver St");
listPersons.add(person1);
Person person2 = new Person();
person2.setFirstName("Roger");
person2.setFirstName("Boyd");
person1.setAddress("1509 Culver St");
listPersons.add(person2);
Person person3 = new Person();
person3.setFirstName("Jonanathan");
person3.setFirstName("Marrack");
person3.setAddress("29 15th St");
listPersons.add(person3);
when(model.getPersons()).thenReturn(listPersons);
String address = "1509 Culver St";
List <Person> listPersonResult = childAlertService.getPersonsFromAdress(address);
assertNotNull(listPersonResult);
}
}
Gracias por tu ayuda.
Nunca se ha inicializado model
en ChildAlertService
en sus pruebas. Su Mock nunca se utiliza.
En su código prod que se basan en la inyección de campo.
Ver: ¿Qué es exactamente Inyección de campo y cómo evitarlo?
El enfoque más limpio es el uso de la inyección de constructor en su servicio, y el uso de ese constructor en sus pruebas (ya sea manualmente o mediante @InjectMocks
)