实体管理器的测试用例
Test case for entity manager
在 Mockito.when
上为以下代码行获取空指针异常。
when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2");
正在尝试模拟声明为
的实体管理器
@Mock
private EntityManager entityManager;
任何解决此问题的帮助?
完成测试class
@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");
}
}
编辑: 啊,很快就通话了。错误在这里...
when(entityManager.createQuery(any(String.class)).setParameter(...)
entityManager
是一个模拟。默认情况下,模拟将 return null
。因此,entityManager.createQuery(...)
将 return 为空。在 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");
旧答案:
很难说没有完整的代码,但可以猜测是您缺少 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 等)。
如果这没有帮助,您将不得不 post 更多的测试 class,否则可能没人能提供帮助。
在 Mockito.when
上为以下代码行获取空指针异常。
when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2");
正在尝试模拟声明为
的实体管理器@Mock
private EntityManager entityManager;
任何解决此问题的帮助?
完成测试class
@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");
}
}
编辑: 啊,很快就通话了。错误在这里...
when(entityManager.createQuery(any(String.class)).setParameter(...)
entityManager
是一个模拟。默认情况下,模拟将 return null
。因此,entityManager.createQuery(...)
将 return 为空。在 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");
旧答案:
很难说没有完整的代码,但可以猜测是您缺少 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 等)。
如果这没有帮助,您将不得不 post 更多的测试 class,否则可能没人能提供帮助。