使用 Mockito 模拟 Spring Boot 存储库删除调用在 get() 上抛出 java.util.NoSuchElementException

Kei*_*ies 1 mockito spring-boot

我是 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
}
Run Code Online (Sandbox Code Playgroud)

我的存储库如下所示:

@RepositoryRestResource
public interface EntityTypeRepository extends LookupObjectRepository<EntityType> {

}
Run Code Online (Sandbox Code Playgroud)

我还没有实现存储库中的任何方法,因为我让 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();       
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行测试时,出现错误“java.util.NoSuchElementException:不存在任何值”

java.util.NoSuchElementException: No value present
    at java.util.Optional.get(Optional.java:135)
    at xyz.unittests.service.EntityTypeServiceTest.whenDelete_thenObjectShouldBeDeleted(OriginatingEntityTypeServiceTest.java:41)
Run Code Online (Sandbox Code Playgroud)

它引用了测试中的行Mockito.when(originatingEntityTypeRepository.findById(1L).get()).thenReturn(entity).thenReturn(null);

我认为我必须模拟该调用的原因是因为服务中的删除方法调用同一服务中的 getById() 方法,该方法又调用entityTypeRepository.findById(id).get()

我假设我必须模拟删除。但显然我错了。任何援助将不胜感激。

非常感谢

bit*_*ttu 6

@Test
public void whenDelete_thenObjectShouldBeDeleted() {                
    final EntityType entity = new EntityType(1L, "new OET");
    Optional<EntityType> optionalEntityType = Optional.of(entity);
     Mockito.when(entityTypeRepository.findById(1L)).thenReturn(optionalEntityType);

    // when
    entityTypeService.delete(entity.getID());

    // then
    Mockito.verify(entityTypeRepository, times(1)).delete(entity);
    //I dont think you need to assert to confirm actual delete as you are testing mock registry. to assert somethink like below you need to return null by mocking the same call again and return the null but thats of no use
    //assertThat(entityTypeRepository.findById(1L).get()).isNull();       
 }
Run Code Online (Sandbox Code Playgroud)

更新了您的测试。基本上我们首先需要模拟 findById 的结果。请参考我上面的评论,断言实际删除。