Mocked方法在Mockito中抛出NullPointerException

时间:2015-03-17 13:07:54

标签: java unit-testing jpa nullpointerexception mockito

这是我的测试类

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


}

当从Mocked对象调用 service.getAllMethod(1,“String”)时,我在 query.setParameter(“name”,Type)获取NPE,因为我认为查询仍然是NULL。请假设我的服务工作正常。 在此先感谢

调试时我检查服务类中查询查询的值。它的值为null。可以找出解决此问题的方法。

1 个答案:

答案 0 :(得分: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
    }
}