Junit 实体管理器的测试用例

Junit 实体管理器的测试用例,junit,junit4,entitymanager,Junit,Junit4,Entitymanager,在以下代码行的Mockito.when上获取空指针异常 when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2"); 正在尝试模拟声明为的实体管理器 @Mock private EntityManager entityManager; 解决这个问题有什么帮助吗 完整测试类 @RunW

在以下代码行的
Mockito.when
上获取空指针异常

when(entityManager.createQuery(any(String.class)).setParameter(any(String.class), any(String.class)).getSingleResult()).thenReturn("2");
正在尝试模拟声明为的实体管理器

@Mock
private EntityManager entityManager;
解决这个问题有什么帮助吗

完整测试类

@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
是一个模拟工具。默认情况下,模拟将返回
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");
旧答案:

如果没有完整的代码很难说,但可以猜测的是您误用了Mockito初始化(实际上为用
@Mock
注释的变量创建对象的部分)。这至少可以通过两种方式实现:

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

这两种方法都将导致Mockito创建所有对象,其中变量用
@Mock
注释(它还处理@injectmock等)


如果这样做没有帮助,你将不得不发布更多的测试类内容,否则可能没有人能提供帮助。

编辑:啊,很快就可以与您联系了。错误就在这里

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");
旧答案:

如果没有完整的代码很难说,但可以猜测的是您误用了Mockito初始化(实际上为用
@Mock
注释的变量创建对象的部分)。这至少可以通过两种方式实现:

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

这两种方法都将导致Mockito创建所有对象,其中变量用
@Mock
注释(它还处理@injectmock等)

如果这没有帮助,您将不得不发布更多的测试类,否则可能没有人可以提供帮助