【问题标题】:Mocked Method is throwing NullPointerException in Mockito模拟方法在 Mockito 中抛出 NullPointerException
【发布时间】:2015-03-17 13:07:54
【问题描述】:

这是我的测试课

     @RunWith(MockitoJUnitRunner.class)
     public class ServiceTest extends Service{


    @Mock
    EntityManager eman = Mockito.mock(EntityManager.class);
    @Mock
    Query query;

    @InjectMocks
    private Service service;


   private static final String NAME = "name";


  @Before
  public void setUp() {

     this.service=new Service();

       }


   @Test
   public void firstMethodTest() {


     Query query = mock(Query.class);   
    when(
            eman.createNamedQuery(NAME)).thenReturn(query);

    when
        (  query.setParameter("name", Type)).thenReturn(query);

    when (query.getSingleResult()).thenReturn(type);

    **service.getAllMethod(1, "string");**


        assertSame(/*Something to compare */);

    }
}

这是我的服务类方法

    public  getAllMethod(int ID, String string)
         {


        Query query=em
                .createNamedQuery("name");

        **query.setParameter("string", Type);**
         type= query.getSingleResult();


}

service.getAllMethod(1, "String") 从 Mocked Object 调用时,我在 query.setParameter("name", Type) 处得到 NPE,因为我认为查询仍然是NULL。请假设我的服务工作正常。 提前致谢

调试时我检查了服务类中Query query的值,它的值为null。不知道如何解决这个问题。

【问题讨论】:

    标签: java unit-testing jpa nullpointerexception mockito


    【解决方案1】:

    您在每次测试之前重新创建您的服务。因此,Mockito 向其中注入模拟的 Service 已经丢失。

    摆脱setUp 方法,而是像这样声明服务:

    @InjectMocks
    private Service service = new Service();
    

    还有其他一些问题。例如EntityManager Mockito.mock 不是必需的,测试类不应扩展 Service@Mock Query 未被使用。


    这是一个粗略的模板:

    @RunWith(MockitoJUnitRunner.class)
    public class TestA {
    
        @Mock
        EntityManager eman;
    
        @InjectMocks
        private Service service = new Service();
    
        @Test
        public void firstMethodTest() {
            Query query = Mockito.mock(Query.class);
            Mockito.when(eman.createNamedQuery(NAME)).thenReturn(query);
    
            service.getAllMethod(1, "string");
        }
    }
    

    假设服务类似于:

    public class Service {
        @Autowired
        EntityManager entityManager;
    
        public void getAllMethod(int i, String s) {
            Query q = entityManager.createNamedQuery("name");
            ...   q isn't null here for me
        }
    }
    

    【讨论】:

    • 我按照@Mr Spoon 的建议进行了更改。还是一样的结果。
    • 我已编辑答案:尝试将其作为测试的起点。
    • 顺便说一句,@Mr Spoon,使用@InjectMocks,Mockito 将通过@RunWith 注释或MockitoAnnotations#initMocks() 自动初始化这些变量
    • 我尝试了上述建议,但仍然遇到同样的错误。 :( 它与我的带有 @Statless 注释的服务类有什么关系吗?还是在任何 XML 中添加更多内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2021-11-17
    相关资源
    最近更新 更多