有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Mocked方法正在Mockito中抛出NullPointerException

这是我的测试课

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


}

服务时。getAllMethod(1,“String”)是从模拟对象调用的,我在查询中得到NPE。setParameter(“name”,Type),因为我认为查询仍然为空。请假定我的服务很好。 提前谢谢

调试时,我在服务类中检查Query Query的值。它的值为空。我想不出如何解决这个问题


共 (1) 个答案

  1. # 1 楼答案

    在每次测试之前,您都在重新创建服务。所以Mockito将mock注入的Service已经丢失

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

    @InjectMocks
    private Service service = new Service();
    

    还有其他一些问题。e、 g.不需要EntityManager{},测试类不应该扩展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
        }
    }