如何在EntityManager中模拟对象?

时间:2017-11-25 17:49:38

标签: java unit-testing junit mocking mockito

我有这个类来模拟DAO:

    //...
    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());

    }

但只是我嘲笑的对象管理器才归零......我怎么能解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

  

但只是我嘲笑的对象管理器才归零......我怎么能解决这个问题?

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

  

默认情况下,对于返回值的所有方法,mock将根据需要返回null,基元/原始包装器值或空集合。例如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());

}