【问题标题】:Unit testing error: java.util.NoSuchElementException: No value present at java.util.Optional.get单元测试错误:java.util.NoSuchElementException:java.util.Optional.get 中没有值
【发布时间】:2018-06-06 09:33:19
【问题描述】:

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

@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(); 
    }

但是当我尝试在下面实现我的 JUnit 时出现错误:No value present at java.util.Optional.get

@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));
    }
}

我有什么遗漏或需要更新的吗?

【问题讨论】:

    标签: java spring junit mockito optional


    【解决方案1】:

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

    之后您将描述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);
          }
    

    注意 1:在您的测试开始时有多余(从未使用过)的对象

    注2:注意Mockito.anyLong()的用法,我认为这更适合您的情况(用于测试service.getById();

    【讨论】:

      【解决方案2】:

      这两种说法都不正确。

       Optional<Object> objectList =
              objectDao.findById(objectId);
       given(objectDao.findById(
              objectList.get().getId())).willReturn(objectList); 
      

      首先,您尝试在模拟(objectDao)上执行 findById,然后模拟调用此函数时需要返回的内容。

      解决这个问题的一种方法是

       @Test
         public void getById() throws RecordNotFoundException{
           Object object = new Object();
           Long objectId = 1L;
           Optional<Object> objectList = // create a object of Type Object manually and assign it 
           given(objectDao.findById(
              objectId)).willReturn(objectList); 
           Object returnedobject = objectServiceImpl.getById(objectId);
           Mockito.verify(objectDao).findById(objectId);
           assertNotNull(returnedobject);
        }
      

      【讨论】:

      • 代码还是一样的。固定部分在哪里?
      • 代码不一样。我已经删除了对 findById 的调用,正如我在评论中指出的那样,您需要创建一个对象并在那里分配它。我不知道你的对象结构来写代码。
      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多