模拟 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);
}
我尝试在我的服务中对方法 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);
}