2016-08-30 27 views
0

对于下面的代码行,在mockito.when上获取一个空指针异常。实体管理器的Junit测试案例

when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2"); 

试图模拟实体管理器,它被声明为

@Mock private EntityManager entityManager;

任何有助于解决这个问题?

完整的测试类

import main.java.com.as.dao.ASDAOImpl; 
 

 
import org.junit.runner.RunWith; 
 
import org.mockito.InjectMocks; 
 
import org.mockito.Mock; 
 
import org.mockito.runners.MockitoJUnitRunner; 
 
import org.springframework.test.util.ReflectionTestUtils; 
 

 
import static org.mockito.Matchers.any; 
 
import static org.mockito.Mockito.*; 
 

 
import org.junit.Before; 
 
import org.junit.Ignore; 
 
import org.junit.Test; 
 
@RunWith(MockitoJUnitRunner.class) 
 
public class ASDAOImplTest 
 
{ 
 
    @InjectMocks 
 
    ASDAOImpl asdaoImpl=new ASDAOImpl(); 
 
    @Mock 
 
    private EntityManager entityManager; 
 
    
 
    @Before 
 
    public void setUp() 
 
    { 
 
     ReflectionTestUtils.setField(asdaoImpl,"capLimit", 1); 
 
    } 
 
    
 
    @Test 
 
    @Ignore 
 
    public void validateCappingTest() 
 
    { 
 
     when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2"); 
 
     asdaoImpl.validateCapping("2"); 
 
    } 
 
    
 

 
}

回答

1

编辑:啊,快说话。错误在这里...

when(entityManager.createQuery(any(String.class)).setParameter(...) 

entityManager是一个模拟。默认情况下,模拟将返回null。所以,entityManager.createQuery(...)将返回null。在null上拨打setParameter是NPE。

需要插入什么是查询模拟...

@Mock 
private Query query; 

... 

// when createQuery is called, return the mocked query object (instead of null) 
when(entityManager.createQuery(any(String.class)).thenReturn(query); 

// make sure that setParameter returns this query object back (would otherwise also be NPE) 
when(query.setParameter(any(String.class), any(String.class)).thenReturn(query); 

// And return the desired result from getSingleResult 
when(query.getSingleResult()).thenReturn("2"); 

老答案:

硬不完整的代码说,但一个猜测是,你misssing的Mockito初始化(实际上为@Mock注释的变量创建对象的部分)。这至少可以两种方式进行:

// Run the whole test with the Mockito runner... 
@RunWith(MockitoJUnitRunner.class) 
public class MyTestClass { ... 

或...

// Do the Mockito initialization "manually" 
@Before 
public void init() { 
    MockitoAnnotations.initMocks(this); 
} 

两种方式都将导致创建的Mockito其中的变量被注解为@Mock(它也处理的所有对象@ InjectMocks等)。

如果这没有帮助,你将不得不发布更多的测试类的,否则很可能没有人可以帮忙。

+0

增加了完整的测试类。问题仍然存在。 – Jill

+0

啊,我的不好,修复了答案。 –