实体经理的测试用例

时间:2016-08-30 06:49:44

标签: 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;

有任何帮助来解决这个问题吗?

完成测试课程

@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 个答案:

答案 0 :(得分:4)

编辑:啊,很快就说了。错误在这里......

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 { ...

...或

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

两种方式都会导致Mockito创建所有变量用@Mock注释的对象(它还处理@InjectMocks等)。

如果这没有帮助,您将需要发布更多的测试课程,否则可能没有人可以提供帮助。