Size: a a a

2021 May 04

S

Sergei in pro.jvm
:)
источник

ГР

Геннадий Романов... in pro.jvm
Пытаюсь замокать Конструктор с параметром java.io.File
PowerMockito.whenNew(SendCsvWorker.class).withArguments(...,
               ArgumentMatchers.<File>
any(File.class),
               
...)
       .thenReturn(sendCsvWorker);

В итоге ArgumentMatchers.any  вызывает defaultValue который возвращает экземпляры примитивных классов или null
И естественно
No constructor found in class 'com.umbrellait.SendCsvWorker' with parameter types: [ java.lang.String, java.lang.String, null, ... ].
источник

SP

Sergey Pavlenko in pro.jvm
В спринге есть замечательный подход по обработке исключений: @ControllerAdvice -> @ExceptionHandler

А как красиво отвечать клиенту, если исключения бросаются в слое сервиса или репо? или кидаться исключениями глубже контроллера - не есть хорошая практика?
источник

АИ

Али Исаев in pro.jvm
Реализовать свой класс-исключение и бросать его?
источник

SP

Sergey Pavlenko in pro.jvm
если его бросить в репо, то @ControllerAdvice  его не перехватывает... или что-то не так делаю..
он же не просто так @ControllerAdviceControllerAdvice ?
источник

ch

central hardware in pro.jvm
если в контролере будет выброщено исключение оно будет перехвачено  @ControllerAdvice не важно насколько глубоко в стеке это произойдет
источник

DC

Denis Chikanov in pro.jvm
Что-то не так делаешь
Если контроллер вызывает [произвольная вложенность вызовов с репозиторием, бросающим исключение], исключение будет поймано
источник

SP

Sergey Pavlenko in pro.jvm
мм.. может я  туплю....

если я бросаю своё исключение в котнтроллере, то всё красиво возвращается:
  @RequestMapping(method = RequestMethod.POST, value = "/auth/login/")
   public ResponseEntity login(@RequestBody UserDetailsRequestDto requestDto, HttpServletResponse response) {
       try {
           ...
           authManager.authenticate(new UsernamePasswordAuthenticationToken(login, requestDto.getPassword()));
          ....
       } catch (AuthenticationException e) {
           throw new ConverterAppException(ErrorMessages.BAD_CREDENTIALS.getErrorMessage());
       }
   }
->
{    "timestamp": "2021-05-04T16:55:27.494+00:00",
   "message": "Invalid username or password"   }



А если исключение при валидации токена в утилитном класса, то в ответ ловлю html со стектрейсом и прочими ужасами.

    public boolean validateToken(String token) throws ConverterAppException {
       try {
       .....
       } catch (JwtException | IllegalArgumentException e) {
           throw new ConverterAppException(ErrorMessages.JWT_TOKEN_INVALID.getErrorMessage());
       }
   }


хотя в приложении есть хендлер:
@RestControllerAdvice
public class ConverterAppExceptionsHandler {
   @ExceptionHandler(value = {ConverterAppException.class})
   public ResponseEntity<Object> handleException(ConverterAppException ex, WebRequest request) {
       ErrorMessage error = new ErrorMessage(new Date(), ex.getMessage());
       return ResponseEntity
               .status(HttpStatus.INTERNAL_SERVER_ERROR)
               .body(error);
   }

где туплю, не пойму...
источник

ch

central hardware in pro.jvm
отключите тот bean что формирует html с stacktrace
источник

SP

Sergey Pavlenko in pro.jvm
но валидация проходит в
public class JwtTokenFilter extends GenericFilterBean {
может в этом дело?
источник

E

Etki in pro.jvm
Красиво - не кидать исключения при нормальной работе программы, включая проваленную валидацию, не найденную запись и т.п., в общем, любой предусмотренный результат ничего не кидает. Но вот насчёт удобно - с этим довольно сложно, приходится большие обертки для результатов операций делать (те же найдено / не найдено / невалидный запрос).
источник

ГР

Геннадий Романов... in pro.jvm
Почему @Autowire в тестах не работает?
@Service
public class Service() { ... }

@SpringBootTest
public class ServiceTest () {
...
@Autowire
Service service;
...
idea подсвечивает Could not autowire. No beans of 'Service' type found.

в результате в ServiceTest service = null
источник

Э

Эд in pro.jvm
Нет, @ControllerAdvice поймал бы, если правильно сделал. Подебажь мб
источник

FR

Frank Richards in pro.jvm
В спринг Бут тест аннотации надо указывать какие классы подтянуть
источник

Э

Эд in pro.jvm
Зачем request в handleException методе?
источник

ГР

Геннадий Романов... in pro.jvm
вот мануал спринга автовайрится без указания класса в @SpringBootTest
https://spring.io/guides/gs/testing-web/


@SpringBootTest
public class SmokeTest {

@Autowired
private HomeController controller;

@Test
public void contextLoads() throws Exception {
 assertThat(controller).isNotNull();
}
}
источник

V

Vlad in pro.jvm
у тебя бин в контекст приложения (SpringBootApplication, который в тестах или основном классе) не попадает, поэтому в тестах не автовайрится. Это вопрос для @javastart скорее
источник

А

Алексей in pro.jvm
Только идея подсвечивает? Или такая ошибка при старте теста?
источник

AE

Alexandr Emelyanov in pro.jvm
Фильтры работают раньше контроллеров и @ControllerAdvice их не оборачивает
источник

SP

Sergey Pavlenko in pro.jvm
Да, фокус оказался в фильтрах. Остальные эксепшены всплывают ок.
источник