如何在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());
}
但就我嘲讽的对象管理器只是来自空...我怎样才能解决这个问题?
答
假设您的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());
}
'manager'是你'testBuscarPorId()''里面null'?你为什么手动模拟'manager'字段并在其上加上'@ Mock'注解? – luk2302
是的,它已经变为空;我这样做是为了强制模拟,但它仍然无法正常工作。 – philabreu
你使用哪个版本的JUnit? –