Size: a a a

2020 July 07

РХ

Ринат Харисов... in learn.java
Rinchin G
Люди подскажите? Пытаюсь разобраться с spring cache

@Cacheable("tokens")
public String getToken(Log log){
 logger.info("get token from log");
 String token = log.getToken();
 tokenInfoProvider.validateSessionCookie(token);
 return token;
}


Для него написал тест

@Test
void getToken() {

 logService.getToken(log);
 logService.getToken(log);
 logService.getToken(log);

}


Насколько я понимаю кэширование, это что он после первого раза больше не полезет в getToken, а должен сразу отдать Token

но почему то
при выполнении теста
все три раза logger выводит

get token from log
get token from log
get token from log


Подскажите куда копать?
@EnableCaching аннотацию проставили?
источник

RG

Rinchin G in learn.java
ага поставил
источник

RG

Rinchin G in learn.java
По идее же CacheManager ставить не обязательно?
источник

RG

Rinchin G in learn.java
ну чтобы заработало?
источник

RG

Rinchin G in learn.java
@EnableCaching
@SpringBootApplication
public class ClientMetricsCollectorApplication {
источник

РХ

Ринат Харисов... in learn.java
Rinchin G
По идее же CacheManager ставить не обязательно?
не обязательно. а в тестах контекст спринга поднимается?
источник

RG

Rinchin G in learn.java
Вроде бы да
я некоторые бины замокал

@SpringBootTest
@RunWith(SpringRunner.class)
class LogServiceTest {

 @Mock
 TokenInfoProvider tokenInfoProvider;
 @Mock
 FilterService filterService;
 @Mock
 SaveService saveService;

 @InjectMocks
 LogService logService;

 @MockBean
 private DataSourceInitializer dataSourceInitializer;

 private Log log;
 private List<Event> eventList;

 @Test
 void getToken() {

   logService.createOrReturnCached(log);
   logService.createOrReturnCached(log);
   logService.createOrReturnCached(log);

 }
источник

RG

Rinchin G in learn.java
Может в этом дело?
источник

YG

Yamma Gamma in learn.java
Никто не подскажет как првильно это тестировать?Я сделал репу в спринге,и спустил всё на уровень сервисов,как нормальные программисты это тестируют?Тем,кто откликнулся,заранее большое спасибо!
источник

RG

Rinchin G in learn.java
Ринат Харисов
не обязательно. а в тестах контекст спринга поднимается?
Понял в чем проблема была, нельзя кэшировать то что в собственном классе, так поднимается прокси класс, кэширование из другого класса работает
источник

SS

Semen Savchenkov in learn.java
Yamma Gamma
Никто не подскажет как првильно это тестировать?Я сделал репу в спринге,и спустил всё на уровень сервисов,как нормальные программисты это тестируют?Тем,кто откликнулся,заранее большое спасибо!
Юниты: мокаешь UserRepository, StringGenerator, инжектишь их в сервис и проверяешь, что тебе нужно.
источник

YG

Yamma Gamma in learn.java
Semen Savchenkov
Юниты: мокаешь UserRepository, StringGenerator, инжектишь их в сервис и проверяешь, что тебе нужно.
Смотри,с моками немного не понимаю,делаю мок и сам ему говорю что когда возвращать,мне ведь нужно оттестить как работает код,а не сделать моки и научить их отвечать так как я хочу
источник

SS

Semen Savchenkov in learn.java
Юнитами ты тестируешь конкретно работу UserServiceImpl, все ли правильно он делает.
источник

D

Dima in learn.java
Yamma Gamma
Никто не подскажет как првильно это тестировать?Я сделал репу в спринге,и спустил всё на уровень сервисов,как нормальные программисты это тестируют?Тем,кто откликнулся,заранее большое спасибо!
1. Не использовать field injection;
2. Использовать constructor injection, в том числе из-за тестирования;
3. ДЛя юнит тестов - мокаешь репозиторий и генератор, руками создаешь объект сервиса UserService = new UserServiceImp(mockRepository, mockGenertor), задаешь ответы вызовов этих классов. Твой тест проверяет только логику самого сервиса;
4. Интеграционный тест - подпимаешь реальный контекст, без моков, для бд используешь testcontainers;
5. Сервисы должны возвращать DTO, домен не протекает в контроллер.

P.S. сорри, но это просто смешно видеть такие вопросы после заявлений про недооцененного миддла за 2-6 месяцев.
источник

YG

Yamma Gamma in learn.java
Dima
1. Не использовать field injection;
2. Использовать constructor injection, в том числе из-за тестирования;
3. ДЛя юнит тестов - мокаешь репозиторий и генератор, руками создаешь объект сервиса UserService = new UserServiceImp(mockRepository, mockGenertor), задаешь ответы вызовов этих классов. Твой тест проверяет только логику самого сервиса;
4. Интеграционный тест - подпимаешь реальный контекст, без моков, для бд используешь testcontainers;
5. Сервисы должны возвращать DTO, домен не протекает в контроллер.

P.S. сорри, но это просто смешно видеть такие вопросы после заявлений про недооцененного миддла за 2-6 месяцев.
Пасибки !
источник

D

Dima in learn.java
Yamma Gamma
Пасибки !
еще рекомендую на гитхабе найти проект Spring PetClinic - там примеры кода и примеры тестов
источник

SQ

Sobitxon Qaraxonov in learn.java
*([True] * n)?
источник

Y

Yusup in learn.java
всем привет, как добавить модуль в jboss?
источник

Ю

Юрий in learn.java
Такой вопрос: конструкция

try(Workbook w = new Wor….){
   ….
   return «fdfdfdf»;
}

перед ретерном или после выполнится закрытик workbook?
источник

Ю

Юрий in learn.java
или ретерн нужнл делать после конструкции try?
источник