Size: a a a

Spring Framework and more

2019 April 11

Ar

Arseny -> r2d2 in Spring Framework and more
@Profile тим лид запретит сделать над двумя сервисами привязанными к одному общему интерфейсу?
источник

Ar

Arseny -> r2d2 in Spring Framework and more
так как тот код, который я разбираю чужой, то мне изменять на практике архитектуру очень не желательно, по крайней мере тим лид этого не особо одобряет.
источник

Ar

Arseny -> r2d2 in Spring Framework and more
это же не поменяет архитектуру, а вдобавок еще и будет соглашение о том что сервис выполняет через интерфейс
источник

PB

Pavel Bukhmatov in Spring Framework and more
Plomipu Dmitri
так как тот код, который я разбираю чужой, то мне изменять на практике архитектуру очень не желательно, по крайней мере тим лид этого не особо одобряет.
Согласен с мнением выше - это не изменения архитектуры.
Но если "тимлид" совсем угашенный, можно у класса бина имплементировать интерфейс EnvironmentAware и вытащить профиль уже там

public class Bla implements EnvironmentAware
   boolean isInMock;
   @Override
   public void setEnvironment(Environment environment)  {
       var profiles = environment.getActiveProfiles();
       if (Arrays.asList(profiles).contains("mock"))
           this.isInMock = true; // маркируем бин, использует флажок в реализации для мок-ответа
   }

Но это конечно же встратый вариант. Человеческий вариант - через @Profile над бином
источник

Ar

Arseny -> r2d2 in Spring Framework and more
есть еще вариант через applicationContext доставать активные профиля.. но согласен, извращение.
источник

Ar

Arseny -> r2d2 in Spring Framework and more
Согласен с мнением выше - это не изменения архитектуры.
Но если "тимлид" совсем угашенный, можно у класса бина имплементировать интерфейс EnvironmentAware и вытащить профиль уже там

public class Bla implements EnvironmentAware
   boolean isInMock;
   @Override
   public void setEnvironment(Environment environment)  {
       var profiles = environment.getActiveProfiles();
       if (Arrays.asList(profiles).contains("mock"))
           this.isInMock = true; // маркируем бин, использует флажок в реализации для мок-ответа
   }

Но это конечно же встратый вариант. Человеческий вариант - через @Profile над бином
источник

PB

Pavel Bukhmatov in Spring Framework and more
Plomipu Dmitri
но тогда мне придётся изменять код в нескольких местах, так как очень много классов обращаются бину ( объекту ) сервиса, не к его интерфейсу
А почему придется изменять? Все что обращается - будет обращаться в интерфейс с таким же именем.
Просто реальная имплементация будет либо одно, либо вторая. Имя бина-то одинаковое
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Arseny -> r2d2
Согласен с мнением выше - это не изменения архитектуры.
Но если "тимлид" совсем угашенный, можно у класса бина имплементировать интерфейс EnvironmentAware и вытащить профиль уже там

public class Bla implements EnvironmentAware
   boolean isInMock;
   @Override
   public void setEnvironment(Environment environment)  {
       var profiles = environment.getActiveProfiles();
       if (Arrays.asList(profiles).contains("mock"))
           this.isInMock = true; // маркируем бин, использует флажок в реализации для мок-ответа
   }

Но это конечно же встратый вариант. Человеческий вариант - через @Profile над бином
Зачем вы каждый раз форвардите сообщение собеседника, перед тем, как ему ответить? Есть же кнопка Reply, а не Forward message.
источник

Ar

Arseny -> r2d2 in Spring Framework and more
Ruslan Stelmachenko
Зачем вы каждый раз форвардите сообщение собеседника, перед тем, как ему ответить? Есть же кнопка Reply, а не Forward message.
я не знаю почему, но у меня не всегда появляется кнопка реплай на телефоне :(
могу в будущем через упоминание отвечать
источник

RS

Ruslan Stelmachenko in Spring Framework and more
на телефоне можно сообщение влево или вправо потянуть (не помню точно) - и это будет Реплай
источник

PD

Plomipu Dmitri in Spring Framework and more
Pavel Bukhmatov
А почему придется изменять? Все что обращается - будет обращаться в интерфейс с таким же именем.
Просто реальная имплементация будет либо одно, либо вторая. Имя бина-то одинаковое
Вообще-то изменит так как инъекция моего сервиса с помощью @Autowired в классах прописана и это как минимум и не в одном месте. Придётся тогда везде менять Бин сервиса на его интерфейс как и в классе конфиге, если чтобы бин сервиса был замокан, нужно делать мок бина из интерфейса, а не конкретного класса.
источник

PD

Plomipu Dmitri in Spring Framework and more
И лезть в переменные среды с помощью кода , чтобы вытаскивать значения профиля мне также не к чему. Мне главное понять: как заставить мокито игнорить приватные и финальные члены класса при создании мока, если они в моей задаче не
нужны
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Plomipu Dmitri
И лезть в переменные среды с помощью кода , чтобы вытаскивать значения профиля мне также не к чему. Мне главное понять: как заставить мокито игнорить приватные и финальные члены класса при создании мока, если они в моей задаче не
нужны
причем тут вообще мокито? У вас спринговый CGLIB не может запроксировать класс, который Мокито уже успешно создал. Видимо cglib не умеет проксировать созданные на лету классы. Попробуйте над своим моковым бином поставить @Scope(proxyMode = ScopedProxyMode.NO) - может быть поможет. К моку-то вряд ли вам нужны постпроцессоры всякие.
источник

PB

Pavel Bukhmatov in Spring Framework and more
То л и я слепой, то ли текстовый файлик со стактрейсом появился после вопроса)
По стактрейсу - CGLIB. Совет выше, но возможно класс определен, как
public final class EmailService
?
источник

RS

Ruslan Stelmachenko in Spring Framework and more
Если он был final, то мокито вообще бы не смог создать ee.h2h.h2hwebserver.service.EmailService$MockitoMock$174655256
источник

PD

Plomipu Dmitri in Spring Framework and more
Ок. Просто мне казалось, что мок сам не был создан.
источник

PD

Plomipu Dmitri in Spring Framework and more
Не думал, что создание его на лету прокси может блокировать, хотя я не врубаюсь, зачем классы на лету создавать ? Ведь у меня же компиляция статическая, не JIT.
источник

PD

Plomipu Dmitri in Spring Framework and more
Спасибо в любом случае за советы.
источник

Д

Дмитрий in Spring Framework and more
имхо - менять класс на интерфейс, создавать бин somethingMock implements Interface и делать уже либо через @Profile, либо через @ConditionalOnProperty
источник

Д

Дмитрий in Spring Framework and more
или через AOP методы подменять)) шучу
источник