当前位置: 首页 > 知识库问答 >
问题:

Spring/Mockito JUnit测试空指针异常

郎成龙
2023-03-14

尝试让JUnit与mockito测试一起工作,并在我的测试中获得NPE。我想验证一下,当调用createRegistrant(registrationDTO)时,紧接着调用了saveUpdateRegistration(Registration reg)方法。我觉得奇怪的一个问题是,在Mockito上。验证(registrationServiceImpl,Mockito.times(1))。创建注册人(registrationDTO) 方法?IntelliJ只建议界面中的方法?

我的测试代码如下:

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

下面是我正在测试的代码:

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

}

共有1个答案

酆恩
2023-03-14

这里有几个问题。

首先,您不模拟RegstrationDAO。这将导致它在测试中的类中为null。接下来,RegstrationService不是模拟,但您尝试在和验证时使用对其进行验证。最后,RegstrationDTO被模拟,因此对中的设置器的调用没有效果。

您的测试应该如下所示:

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

假设注册有一个实现的equals方法,其中比较设置的字段。如果没有,则需要使用参数捕获器。

 类似资料:
  • 我有一个主页。我正在尝试使用测试注释测试TestNG中的页面标题。我得到了testTitle()的NullPointerException。url正在打开。

  • 我正在尝试通过Maven运行cucumber+testng+selenium。 当我在Eclipse中通过TestNG测试运行它时,它工作得很好,但当我使用mvn测试时,它会抛出空指针异常 我是不是漏掉了什么?

  • 我对spring有点陌生,我遇到了一个空指针异常。我认为在我的MongoRepository上不起作用。由于某种原因,当我试了一些例子时,它起作用了。(运行函数中注释掉的代码起作用) 这是我得到的错误: 2016-05-20 02:31:20.877错误6272---[nio-8080-exec-2]O.A.C.C.C.[.[.[/].[dispatcherServlet]:路径为[]的上下文中s

  • 问题内容: 有可能这可能是一个双重问题。我将String变量初始化为null。我可能会或可能不会使用一个值更新它。现在我想检查此变量是否不等于null以及我尝试执行的操作是否会得到null指针异常。空指针异常,因为它代价高昂。是否有任何有效的解决方法.TIA 问题答案: 如果您使用 你 不会 得到。 我怀疑你在做什么: 这是因为null 而引发,而不是因为null。 如果仍然无法解释,请发布您用于

  • 我已经更新了我的项目中的一些依赖关系之后,我的Hibernate配置类显示Nullpointerx的。 我将SpringDataJPA存储库与hibernate一起使用,已经超过24小时了,仍然没有找到任何关于小问题的适当解决方案。 我已经尝试过的一些解决方案:- 使用@bean(name=“entityManagerFactory”)提供bean名称 我面临的问题 波姆。xml文件 配置类 db

  • 我是一个Spring新手,面临着Spring Security性的问题。 我正在尝试实现一个自定义UserDetailsService,用于用户检索,并在访问UserService对象时获得一个空指针异常。我正在自动连接这个对象。当在其他控制器和服务方法上完成时,autowirng可以正常工作,但是由于某些原因,它在这里不工作,因此当访问autowired对象(UserService)时,我会得到