
Pavel ?
25.09.2016
16:46:03

Ivan
25.09.2016
16:46:17
для меня это больная тема на самом деле
?

Pavel ?
25.09.2016
16:49:33
Тут как бы надо смотреть на то сколько будет народу пилить проект)) если один два то и хрен с ним, если толпа то...

Google

Ivan
25.09.2016
16:58:53
ну после пары лет работы со Spring я понял что некоторые вещи лучше делать не на нем, Spring загоняет в очень жесткие рамки выйти за пределы которых иногда очень сложно, иногда возникают ошибки которые решаешь днями, копая тонны документации и лазия по коду Spring, некоторые решения так прибиты гвоздями что лучше их не использовать
например:
есть бин
@Bean
public Clock clock() {
return Clock.systemDefaultZone();
}
в тестах мне нужно его переопределить и я делаю это примерно так
@Configuration
public static class TestConfig {
@Bean
@Primary
public Clock clock() {
return Clock.fixed(Instant.from(ZonedDateTime.of(2016, 8, 15, 0, 0, 0, 0, ZoneId.systemDefault())), ZoneId.systemDefault());
}
}
все ок работает но вот незадача тесты с 0.5 секунд на выполнение улетают в 10-12 секунд, времени править эту проблему нет, и выполнение тестов увеличивается на целых 10 секунд

Митко Соловец?
25.09.2016
17:13:27
эм, а зачем бин тут?
у тебя же есть фабричный статик метод


Pavel ?
25.09.2016
17:13:46
ну после пары лет работы со Spring я понял что некоторые вещи лучше делать не на нем, Spring загоняет в очень жесткие рамки выйти за пределы которых иногда очень сложно, иногда возникают ошибки которые решаешь днями, копая тонны документации и лазия по коду Spring, некоторые решения так прибиты гвоздями что лучше их не использовать
например:
есть бин
@Bean
public Clock clock() {
return Clock.systemDefaultZone();
}
в тестах мне нужно его переопределить и я делаю это примерно так
@Configuration
public static class TestConfig {
@Bean
@Primary
public Clock clock() {
return Clock.fixed(Instant.from(ZonedDateTime.of(2016, 8, 15, 0, 0, 0, 0, ZoneId.systemDefault())), ZoneId.systemDefault());
}
}
все ок работает но вот незадача тесты с 0.5 секунд на выполнение улетают в 10-12 секунд, времени править эту проблему нет, и выполнение тестов увеличивается на целых 10 секунд
Тобишь ты подкл контекст апликейшена и примарями форсишь бины?

Ivan
25.09.2016
17:14:31
да

Pavel ?
25.09.2016
17:14:47
Ну так создай тестовый контекст, поможет

Ivan
25.09.2016
17:15:49
не понял, я использую аннотацию ContextConfiguration
на тесте
я не так что то делаю?

Pavel ?
25.09.2016
17:16:31
Копипастни тест
Плиз

Митко Соловец?
25.09.2016
17:16:38
т.е. ты используешь основной контекст, но какие-то бины моками подменяешь?

Pavel ?
25.09.2016
17:16:52

Google

Pavel ?
25.09.2016
17:17:01
Как я понял

Митко Соловец?
25.09.2016
17:17:09
ну указывает, какие бины приоритетней
а так контекст от основного приложения

Ivan
25.09.2016
17:17:47
тут один бин конкретно, сейчас скину код
@Transactional
@Rollback
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionDbUnitTestExecutionListener.class})
@ContextConfiguration(loader = SpringApplicationContextLoader.class, classes = {Application.class, SubProjectServiceTest.TestConfig.class})
public class ProjectServiceTest extends AuthorizedUserTest {
@Configuration
public static class TestConfig {
@Bean
@Primary
public Clock clock() {
return Clock.fixed(Instant.from(ZonedDateTime.of(2016, 8, 15, 0, 0, 0, 0, ZoneId.systemDefault())), ZoneId.systemDefault());
}
}
....
}

Митко Соловец?
25.09.2016
17:17:50
попробуй убрать праймари и без него посмотри, что происходит
Application.class, SubProjectServiceTest.TestConfig.class
ну понял

Ivan
25.09.2016
17:18:19
если убрать примари то Spring ругнется что не понимает какой бин инжектить скорее всего

Митко Соловец?
25.09.2016
17:18:31
или заинжекти не тестовую
твоя цель выявить, как поведет перфоманс себя
если праймари тормозит, то багу завести надо, а тебе сделать обертку интерфейсом
тогда просто подменять руками будешь
я бы так поступил

Ivan
25.09.2016
17:19:20
возможно еще виноват static класс
может с эти проблемы

Митко Соловец?
25.09.2016
17:19:27
эмммм
конечно
бины + статик классы не рекомендованы к использованию
я же выше писал, есть фабрика - используй напрямую

Google

Митко Соловец?
25.09.2016
17:20:00
там могут прокси тормозить

Ivan
25.09.2016
17:20:24
что ты имеешь ввиду говоря фабрика?

Митко Соловец?
25.09.2016
17:20:36
метод, который тебе экземпляр возвращает)
Clock.systemDefaultZone()

Ivan
25.09.2016
17:24:31
я не полностью все описал, Clock нужен чтобы метод now возвращал нужную мне дату
в рантайме это системное время, в тестах определенное мной
Clock инжектится в разные сервисы где уже используется в LocalDate.now(clock);
конкретно в этом тесте еще инжектится сам сервис
SubProjectService логика которого тестируется
можно конечно сделать subProjectService.setClock()

Митко Соловец?
25.09.2016
17:25:51
https://docs.oracle.com/javase/8/docs/api/java/time/Clock.html
этот класс?

Ivan
25.09.2016
17:26:11
да

Митко Соловец?
25.09.2016
17:26:37
Clock()
Constructor accessible by subclasses.
Modifier
protected
конструктор непубличный, вполне спрингу может понадобится время на дополнительные манипуляции)

Ivan
25.09.2016
17:28:34
и вот прикинь ты уже сидишь и строишь теории
и я так
нашел ошибку пару часов сижу

Митко Соловец?
25.09.2016
17:28:59
ну я стараюсь не делать бинов из классов библиотек, да еще и статических

Ivan
25.09.2016
17:29:51
ну здесь я сделал чтобы иметь возможность тестировать, потому что вызывать LocalDate.now() совсем плохо

Митко Соловец?
25.09.2016
17:30:19
http://stackoverflow.com/questions/27067049/unit-testing-a-class-with-a-java-8-clock
может это пригодится

Google

Ivan
25.09.2016
17:39:42
еще по спрингу, вот есть у него аннотация @ModelAttribute а какой от нее реальный толк? все равно юзаешь model.addAttribute там где тебе нужно чтобы не делать лишних запросов и вообще лишней работы при загрузке страницы, получается целая фича фреймворка не нужна

Митко Соловец?
25.09.2016
17:40:45
эм, в смысле?
как ты, например без этой аннотации свяжешь форму и свою ДТОшку?
может стоит лучше изучить инструмент ?
чтобы такие громкие заявления делать...

Ivan
25.09.2016
17:41:44
model.addAttribute
все связал
model.addAttribute("dto", dto);

Митко Соловец?
25.09.2016
17:42:06
@Secured({"ROLE_USER", "ROLE_MODERATOR", "ROLE_ADMIN"})
@RequestMapping(value = "/profile/edit", method = RequestMethod.POST)
public ModelAndView editAccount(@ModelAttribute("account") RegisterDTO account) {
final Account edited = accountService.editProfile(new Account(account));
SecurityUtils.updateSessionInfo(edited);
return new ModelAndView("redirect:/profile");
}

Ivan
25.09.2016
17:42:09
а ты имеешь ввиду данные из формы?

Admin
ERROR: S client not available

Митко Соловец?
25.09.2016
17:42:12
например

Ivan
25.09.2016
17:42:19
так они вяжется и без @ModelAttribute
попробуй убери @ModelAttribute
в POST запросе

Митко Соловец?
25.09.2016
17:42:49

Ivan
25.09.2016
17:43:01
@ModelAttribute в этом случае для других целей используется
делаешь метод
@ModelAttribute
public Project getProject(@RequestParam(value = "id", required = false) Long id) {
return id == null ? new Project() : entityService.findOneJoinAll(id);
}

Google

Ivan
25.09.2016
17:43:27
и у тебя будет либо объект из БД либо новый во время биндинга формы
а так чтобы данные с формы были забинжены нужно просто BindingResult после DTO
когда ты ее на параметр вешаешь этот параметр так же автоматом добавляется в модель вьюхи

Митко Соловец?
25.09.2016
17:45:49
мне просто изменить надо было аттрибут модели
коим являлся аккаунт )

Ivan
25.09.2016
17:47:03
кстати если гуглить @ModelAttribute то половину вопросо а что делает эта аннотация

Митко Соловец?
25.09.2016
17:47:32
и там написано, что написал выше ты и я)

Ivan
25.09.2016
17:48:12
а ну ты скорее всего искал как
аттрибут
засетить
я понял

Митко Соловец?
25.09.2016
17:48:51
мне нужно было, чтобы обновив сведения об аккаунте, содержимое формы на респонсе тоже обновилось)

Ivan
25.09.2016
17:48:59
понял

Митко Соловец?
25.09.2016
17:49:34
ну а вообще, редко я такими инструментами MVC пользуюсь, в последнее время только @RestController

Ivan
25.09.2016
17:52:03
как раз я думаю что нибудь полегче юзать для этих целей

Митко Соловец?
25.09.2016
17:52:13
спарк

Ivan
25.09.2016
17:52:44
ну да, а как отдаете объекты по ресту? я имею ввиду не пользуетесь спринговыми репозиториями
?

Митко Соловец?
25.09.2016
17:52:58
что ты имеешь в виду?

Ivan
25.09.2016
17:53:57
у спринга была какая то либа которая прям ответы методов spring data repository(ну конкретно JPA например) умела преобразовывать в JSON

Митко Соловец?
25.09.2016
17:54:04
понял

Ivan
25.09.2016
17:54:08
Spring REST Вроде

Митко Соловец?
25.09.2016
17:54:09
ты про спринг дата рест