Mock NullPointerException - PullRequest
       78

Mock NullPointerException

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

Я пытаюсь выполнить тест Junit для метода getPersonsFromAddress () в моем сервисе, я пытаюсь смоделировать объектную модель, но когда я выполняю тест, в сервисе появляется исключение NullPointerException при вызове model.getPersons ().

Вот мой сервис с методом 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;
        }

Вот мой тест:

@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);
        }

}

Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Вы никогда не инициализировали model в ChildAlertService в своих тестах. Ваш макет никогда не используется.

В коде вашего продукта вы полагаетесь на инжекцию поля.

См .: Что такое Инъекция поля и как ее избежать?

Самый чистый подход - использовать инжектор конструктора в вашем сервисе и использовать этот конструктор в ваших тестах (либо вручную, либо через @InjectMocks)

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

Если вы используете Spring, вы можете использовать @SpyBean или @MockBean вместо простого @Mock. Они поставляются с spring-boot-starter-test.

, но, я думаю, лучшее решение - это фактически инициализировать сервис сам по себе:

private ChildAlertService childAlertService;

private Model model;

@Before
public void setUp() {
    model = mock(Model.class);
    childAlertService = new ChildAlertService(model);
}
...