java - 单元测试错误 : java. util.NoSuchElementException : No value present at java. util.Optional.get

标签 java spring junit mockito optional

我正在尝试在下面对我的对象服务进行单元测试:

@Service
public class ObjectServiceImpl implements ObjectService{

  private final ObjectDao objectDao;

  @Autowired
  public ObjectServiceImpl(ObjectDao objectDao){
    this.objectDao = objectDao;
  }

  @Override
    public Object getById(Long ObjectId) throws RecordNotFoundException {
        Optional<Object> Object = ObjectDao.findById(ObjectId);
        if (!Object.isPresent()) {
            throw new RecordNotFoundException(String.format(
                    MessageConstants.ObjectID_NOT_FOUND, ObjectId));
        }
        return Object.get(); 
    }

但是我收到一个错误:No value present at java.util.Optional.get当我尝试在下面实现我的 JUnit 时:
@RunWith(MockitoJUnitRunner.Silent.class)
public class ObjectServiceTest {

    @InjectMocks
    private ObjectServiceImpl objectServiceImpl;

    @Mock
    private ObjectDao objectDao;

    private ObjectService objectService;

    @Test
    public void getById() throws RecordNotFoundException{
        Object object = new Object();
        Long objectId = 1L;
        Optional<Object> objectList =
            objectDao.findById(objectId);
        given(objectDao.findById(
                    objectList.get().getId())).willReturn(objectList);
        objectServiceImpl.getById(Mockito.anyLong());
        Mockito.verify(objectDao).findById(objectId);
        assertNotNull(objectServiceImpl.getById(objectId));
    }
}

有什么我错过的或我需要更新的吗?

最佳答案

您应该在这里做的第一件事是为 objectList 创建一个 stub 。 .

之后你会描述objectDao行为,并进行验证。我的解决方案变体是:

       @Test
       public void getById() throws RecordNotFoundException{
         // if it's List in your case
         Optional<Object> objectList = Optional.of(Arrays.asList(new YourType()));              
         given(objectDao.findById(Mockito.anyLong())).willReturn(objectList); 
         Object returnedObject = objectServiceImpl.getById(1L);
         Mockito.verify(objectDao).findById(Mockito.anyLong());
         assertNotNull(returnedObject);
      }

Note 1: There is redundant(never used) object at the beginning of your test

Note 2: Notice usage of Mockito.anyLong(), which I think more appropriate in your case(for testing service.getById();)

关于java - 单元测试错误 : java. util.NoSuchElementException : No value present at java. util.Optional.get,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50716941/

相关文章:

java - Maven 程序集插件从特定依赖项中排除文件

java - Android/RxJava 如何链接网络请求并在失败时重试

java - init 方法调用失败;添加 Hibernate envers 后嵌套异常是 java.lang.NoSuchMethodError

java - Selenium typeKeys 从正在键入的字符串中删除点

java - org.springframework.boot.test.mock.mockito.MockReset 上的 NoClassDefFoundError

java - 将 @Transaction 注释与 @Autowired 一起使用 - Spring

java - 如果我们将两个不同版本的 jar 文件放在类路径中会发生什么?

java - Spring GetMapping注解异常

spring - 没有将Spring DAO注入(inject)JSF管理的bean中

java - 在 Mockito doReturn 方法中指定传递给方法的特定枚举