Ошибка модульного тестирования: java.util.NoSuchElementException: в java.util.Optional.get отсутствует значение - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь реализовать модульное тестирование моего объекта Object ниже:

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


}

Есть что-то, что я пропустил или что мне нужно обновить?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Первое, что вы должны сделать здесь, это создать заглушку для 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();)

0 голосов
/ 06 июня 2018

Эти два утверждения не верны.

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

Сначала вы пытаетесь выполнить findById для макета (objectDao), а затем вы высмеиваете, что должно быть возвращено при вызове этой функции.

Один из способов исправить это

 @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);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...