【发布时间】:2018-11-21 09:00:38
【问题描述】:
我是 Spring Boot 和 Mockito 的新手,在我的服务测试中模拟存储库调用时遇到问题。
我有一个“删除”服务方法调用,如下所示,我试图通过模拟存储库调用来使用 Mockito 进行测试:
public interface IEntityTypeService {
public EntityType getById(long id);
public EntityType getByName(String name);
public List<EntityType> getAll();
public void update(EntityType entityType);
public void delete(long id);
public boolean add(EntityType entityType);
}
@Service
public class EntityTypeServiceImpl implements IEntityTypeService {
@Autowired
private EntityTypeRepository entityTypeRepository;
@Override
public void delete(long id) {
entityTypeRepository.delete(getById(id));
}
@Override
public EntityType getById(long id) {
return entityTypeRepository.findById(id).get();
}
....implementation of other methods from the interface
}
我的存储库如下所示:
@RepositoryRestResource
public interface EntityTypeRepository extends LookupObjectRepository<EntityType> {
}
我没有在存储库中实现任何方法,因为我让 Spring Boot 为我连接它。
我的测试如下:
@RunWith(SpringRunner.class)
public class EntityTypeServiceTest {
@TestConfiguration
static class EntityTypeServiceImplTestContextConfiguration {
@Bean
public IEntityTypeService entityTypeService() {
return new EntityTypeServiceImpl();
}
}
@Autowired
private IEntityTypeService entityTypeService;
@MockBean
private EntityTypeRepository entityTypeRepository;
@Test
public void whenDelete_thenObjectShouldBeDeleted() {
final EntityType entity = new EntityType(1L, "new OET");
Mockito.when(entityTypeRepository.findById(1L).get()).thenReturn(entity).thenReturn(null);
// when
entityTypeService.delete(entity.getID());
// then
Mockito.verify(entityTypeRepository, times(1)).delete(entity);
assertThat(entityTypeRepository.findById(1L).get()).isNull();
}
}
当我运行测试时,我收到一条错误消息“java.util.NoSuchElementException: No value present”
java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:135)
at xyz.unittests.service.EntityTypeServiceTest.whenDelete_thenObjectShouldBeDeleted(OriginatingEntityTypeServiceTest.java:41)
它引用了测试中的行Mockito.when(originatingEntityTypeRepository.findById(1L).get()).thenReturn(entity).thenReturn(null);
我认为我必须模拟该调用的原因是因为 Service 中的 delete 方法调用了同一服务中的 getById() 方法,而后者又调用了 entityTypeRepository.findById(id).get()
就是这样,我假设我必须模拟删除。但很明显我错了。任何帮助将不胜感激。
非常感谢
【问题讨论】:
-
好吧 entityTypeRepository.findById(1L) 还没有被模拟,我们在上面调用了 get()。
标签: spring-boot mockito