Java 模拟加载导航属性
这是我的代码的一个非常简化的版本,它说明了具体的问题 是否有任何方法可以控制从测试中调用accountProductRepository.refresh()时发生的情况 不知何故,我需要在buyProduct()方法中创建的AccountProductPojo上设置ProductPojo,以便在访问getProduct().getName()属性时不会得到空指针 refresh使用javax.persistence.EntityManager.refresh()根据buyProduct()方法中设置的id加载导航属性Java 模拟加载导航属性,java,unit-testing,mockito,Java,Unit Testing,Mockito,这是我的代码的一个非常简化的版本,它说明了具体的问题 是否有任何方法可以控制从测试中调用accountProductRepository.refresh()时发生的情况 不知何故,我需要在buyProduct()方法中创建的AccountProductPojo上设置ProductPojo,以便在访问getProduct().getName()属性时不会得到空指针 refresh使用javax.persistence.EntityManager.refresh()根据buyProduct()方法中
这似乎是一个相当经典的案例 您可以尝试以下方法:
Mockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
AccountProductPojo accountProduct = (AccountProductPojo) args[0];
accountProduct.setProduct(new ProductPojo(PRODUCT_ID_CONSTANT, PRODUCT_NAME_CONSTANT));
return null;
}}).when(accountProductRepository).refresh(Mockito.any());
这里的关键是,在模拟上调用
refresh()
时,您可以在POJO上调用setProduct()
,POJO作为参数传递给refresh()
调用,以避免以后出现空指针异常 Mockito.when(你的方法)。然后返回(某物)。除了这一点之外,它看起来像是buyProduct()中的一个bug,在这里调用setProductId(accountId)
。productId参数未使用。哦,是的,这是一个复制粘贴错误,正在编辑。
Mockito.doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
AccountProductPojo accountProduct = (AccountProductPojo) args[0];
accountProduct.setProduct(new ProductPojo(PRODUCT_ID_CONSTANT, PRODUCT_NAME_CONSTANT));
return null;
}}).when(accountProductRepository).refresh(Mockito.any());