简体   繁体   English

Spring / Mockito Junit测试Null指针异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM