模拟 NullPointerException

Mock NullPointerException

我尝试在我的服务中对方法 getPersonsFromAddress() 进行 Junit 测试,我尝试模拟对象模型,但是当我执行测试时 model.getPersons() 时服务中出现 NullPointerException被调用。

这是我使用方法 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);
        }

}

感谢您的帮助。

您从未在测试中初始化 ChildAlertService 中的 model。您的 Mock 从未被使用过。

在您的产品代码中,您依赖于字段注入。

参见:

最干净的方法是在您的服务中使用构造函数注入,并在您的测试中使用该构造函数(手动或通过 @InjectMocks

如果您使用 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);
}