如何在EntityManager中模拟对象?

如何在EntityManager中模拟对象?

问题描述:

我有这个类来嘲弄一个DAO:如何在EntityManager中模拟对象?

//... 
    private ClientesRepository clientesRepository; 

    @Mock 
    private Cliente cliente; 

    @Mock 
    private EntityManager manager; 

    @Before 
    public void init() { 
     MockitoAnnotations.initMocks(this); 

     manager = Mockito.mock(EntityManager.class); 

     clientesRepository = new ClientesRepository(manager); 
    } 

    @Test 
    public void testBuscarPorId() { 

     Mockito.when(manager.find(Cliente.class, new Long(1))).thenReturn(cliente); 

     Cliente clientePesquisado = clientesRepository.buscarPorId(new Long(1)); 

     assertEquals(Long.valueOf(1), clientePesquisado.getId()); 

    } 

但就我嘲讽的对象管理器只是来自空...我怎样才能解决这个问题?

+0

'manager'是你'testBuscarPorId()''里面null'?你为什么手动模拟'manager'字段并在其上加上'@ Mock'注解? – luk2302

+0

是的,它已经变为空;我这样做是为了强制模拟,但它仍然无法正常工作。 – philabreu

+0

你使用哪个版本的JUnit? –

假设您的DAO正在返回给定ID的Cliente类型的对象,则可能是以下原因。 (我猜是因为你没有发布方法clientesRepository.buscarPorId()的代码)。

但只是我嘲笑的对象管理器只是空来...我怎么解决这个问题?

原因是,你告诉manager返回给你一个模拟对象,即cliente。对于返回对象的方法,这个对象默认会返回null的值。这意味着clientePesquisado.getId()将返回null,因为Long是一个对象。下面是从Mockito文件的摘录:

默认情况下,返回值的所有方法,一个模拟将返回空值,原始/原始包装值或空集,适当。例如,0表示int/Integer,false表示布尔值/布尔值。

所以,你必须改变你的测试方法类似如下:

//... 
private ClientesRepository clientesRepository; 

@Mock 
private EntityManager manager; 

@Before 
public void init() { 
    MockitoAnnotations.initMocks(this); 
    clientesRepository = new ClientesRepository(manager); 
} 
@Test 
public void testBuscarPorId() { 
    Cliente expected = new Cliente(1, ...); 

    Mockito.when(manager.find(Cliente.class, new Long(1))).thenReturn(expected); 

    Cliente clientePesquisado = clientesRepository.buscarPorId(new Long(1)); 

    assertEquals(Long.valueOf(1), clientePesquisado.getId()); 

} 
+0

它没有工作@ujulu经理不断给予nullPointerException;我实际上一直在研究网络,我已经看到,进行集成测试会更有效,因为它们测试从一个组件到另一个组件的传输和数据流量,这就是我的情况。无论如何,感谢您的帮助。 – philabreu

+0

“管理者不断给予nullPointerException:”你在哪一行得到异常?编辑问题并发布“ClientesRepository”和“Cliente”的代码。然后,我会尝试查看您遇到问题的位置。 – ujulu