[英]Spring/Mockito Junit testing Null Pointer Exception
Trying to get JUnit with mockito testing to work and getting a NPE on my test here. 尝试使具有模拟测试的JUnit正常工作,并在此处进行NPE测试。 I'm wanting to have a verify that when
createRegistrant(registrationDTO)
is called, saveUpdateRegistration(Registration reg)
method is called right after. 我想验证一下,当
createRegistrant(registrationDTO)
, saveUpdateRegistration(Registration reg)
又调用saveUpdateRegistration(Registration reg)
方法。 An issue I find strange is that on Mockito.verify(registrationServiceImpl, Mockito.times(1)).createRegistrant(registrationDTO);
我发现一个奇怪的问题是在
Mockito.verify(registrationServiceImpl, Mockito.times(1)).createRegistrant(registrationDTO);
it is not suggesting I can test if saveUpdateRegistration(Registration reg)
method was called? 这并不意味着我可以测试是否
saveUpdateRegistration(Registration reg)
方法? IntelliJ only suggests methods that are in my interface? IntelliJ仅建议我界面中的方法吗?
My test code below: 我的测试代码如下:
@RunWith(MockitoJUnitRunner.class)
public class RegistrationServiceImplTest {
@InjectMocks
private RegistrationServiceImpl registrationServiceImpl;
@Mock
private RegistrationDTO registrationDTO;
@Mock
private Registration registration;
@Before
public void setup() {
registrationDTO.seteId("abc123");
registrationDTO.setTech("AWS");
registrationDTO.setFirstName("Bob");
registrationDTO.setLastName("Tom");
}
@Test
public void createRegistrant() throws Exception {
// Mockito.when(registrationServiceImpl.createRegistrant(registrationDTO)).thenReturn(registrationDTO);
Mockito.when(registrationServiceImpl.createRegistrant(registrationDTO)).thenReturn(registrationDTO);
registrationServiceImpl.createRegistrant(registrationDTO);
Mockito.verify(registrationServiceImpl, Mockito.times(1)).createRegistrant(registrationDTO);
}
Here is the code I'm testing: 这是我正在测试的代码:
package com.TechODex.service;
import com.TechODex.dto.RegistrationDTO;
import com.TechODex.model.Registration;
import com.TechODex.dao.RegistrationDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class RegistrationServiceImpl implements RegistrationService {
@Autowired
private RegistrationDAO registrationDAO;
public RegistrationDTO createRegistrant(RegistrationDTO reg) {
saveUpdateRegistration(setDTOToModel(reg));
return reg;
}
public void deleteRegistrant(Long id) { deleteUserRegistrant(id); }
public List<Registration> findAllRegistrant(String tech) { return findAllRegistrantDAO(tech);}
public List<Registration> findAllTech() { return findAllTechDAO();}
private Registration setDTOToModel(RegistrationDTO dto){
Registration registration = new Registration();
registration.setFirstName(dto.getFirstName());
registration.setLastName(dto.getLastName());
registration.seteId(dto.geteId());
registration.setTech(dto.getTech());
return registration;
}
private void saveUpdateRegistration(Registration reg){ registrationDAO.save(reg);}
}
There are several issues here. 这里有几个问题。
First, you do not mock RegistrationDAO
. 首先,您不嘲笑
RegistrationDAO
。 This will lead to it being null
in the class under test. 这将导致它在被测类中为
null
。 Next, RegistrationService
is not a mock, yet you try to use when
and verify
on it. 接下来,
RegistrationService
不是一个模拟,但是您尝试使用when
并对其进行verify
。 Last, RegistrationDTO
is mocked, so the invocations to the setters in @Before
has no effect. 最后,
RegistrationDTO
是@Before
,因此@Before
对setter的调用无效。
Your test should look something like: 您的测试应类似于:
@RunWith(MockitoJUnitRunner.class)
public class RegistrationServiceImplTest {
@InjectMocks
private RegistrationServiceImpl registrationServiceImpl;
@Mock
private RegistrationDAO registrationDAO;
private RegistrationDTO registrationDTO;
private Registration registration;
@Before
public void setup() {
registration = new Registration();
registration.seteId("abc123");
registration.setTech("AWS");
registration.setFirstName("Bob");
registration.setLastName("Tom");
registrationDTO = new RegistrationDTO();
registrationDTO.seteId("abc123");
registrationDTO.setTech("AWS");
registrationDTO.setFirstName("Bob");
registrationDTO.setLastName("Tom");
}
@Test
public void createRegistrant() throws Exception {
final RegistrationDTO result = registrationServiceImpl.createRegistrant(registrationDTO);
assertSame(registrationDTO, result);
verify(registrationDAO).save(eq(registration));
}
}
given that Registration
has an implemented equals-method where the fields that are set are compared. 假设
Registration
有一个已实现的equals-method,在其中对设置的字段进行比较。 If not, you need to use an ArgumentCaptor
. 如果不是,则需要使用
ArgumentCaptor
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.