Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Java |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 3 [4] 5 6 7 8 9 10 .. 21 вперед Ctrl→ |
asv79 Member Откуда: Тверь Сообщений: 3090 |
я это все уже давно читал,там ничего нового нет для,про тесты там ничего нет,НЕ спроста энтузиасты свои либы пищут чтобы можно было без костылей тестить jpa на постргресе |
||||
4 окт 19, 22:42 [21987176] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
аа спасибо)) блин еще и ноут с огорчухи на работе забыл,щас бы затестил) |
||||
4 окт 19, 22:43 [21987178] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
вот в этом и загвоздка,где и как прописать ,что для тестов мы используем другую базу я создал в папке test папку resources ,пометил ее как test resources folder положил файл application.properties с настройками тест базы далее я ожидал ,что спринг сам подхватит оттуда настройку ,но этого не произошло далее я поставил над тестом анотацию @TestPropertySource(locations = "test/resources/application.properties") и тут же получил ошибку Caused by: java.io.FileNotFoundException: class path resource [com/alekseev/Javatesting/Controller/test/resources/application.properties] cannot be opened because it does not exist он пытается искать ресурсы в том же пакете что и приложение ворпос простой у русского человека что делать и кто виноват |
||
7 окт 19, 10:35 [21987986] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
если же анотацию @TestPropertySource(locations = "test/resources/application.properties") убрать то тест работает на основной базе вот и получается простой вопрос где и как указать спрингу ,чтобы он использовал настройки для теста,а не для приложения обычного |
7 окт 19, 10:40 [21987992] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
вообще конечно ничего не понятно прежде чем запустить тест я должен запустить основное приложение,оно же не знает что сейчас будет тест- и запускается на тех настройках,какие по дефолту -соотвсвтенно там база данных не тестовая далеко,а самая обычная далее я запускаю тест -который ожидает что приложение работает на тест базе ,а не на основной ,кладу в эту базу что то и естесственно получаю фейл,так как в тестовой базе даже таблица не создается что то не то тут явно -где то суть я утерял этих тестов судя по всему |
7 окт 19, 11:11 [21988007] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
а нет вру) все таки тестовая база создалась,но тест проваливается,так как я обращаюсь к контроллеру который берет значение из основной базы а тест происходит тестовой базе получается нужно изначально чтобы приложение стартовало на тест базе?получатеся в автоматическом режиме никак? тоесть нужно руками постоянно менять проперть? |
7 окт 19, 11:15 [21988011] Ответить | Цитировать Сообщить модератору |
mad_nazgul Member Откуда: Сообщений: 5609 |
Э-э-э а почему в тесте нельзя поднять контекст вместе с контроллером и обращаться из теста к нему? |
||
7 окт 19, 11:39 [21988030] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 50489 |
asv79, твои сорцы уже секретные? Есть масса способов разделить конфигурации. По сути на твой вопрос - есть миллион ответов. Все они - экспертные. И имеют разную сложность в реализации. Чтоб сказать уверенно что тебе надо сделать - лучше всего видеть с чем мы боремся. |
7 окт 19, 11:51 [21988039] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
знать бы как это делать вот мой рест контроллер @RestController public class ControllerForTest { @Autowired private QuestionRepo questionRepo; @RequestMapping("/faa") public List<Question>sss(){ return questionRepo.findAll(); } } при обращении к этому урлу отдает все вопросы из базы вот тест для этого контроллера тут я использую проперть для тестов,в которой указана тест база с помощью тестресттимплейта я обращаюсь к урлу этого контроллера если приложение не запущео тест выдаст -конекшн файлед если запущено-то оно запущего есно на основной базе а тест идет на тестовой базе я понимаю либо руками нужно постоянно проперти менять на тестах либо в тесте каким то образом запустить приложение -хер знает как это сделать @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest @TestPropertySource(locations="classpath:application-test.properties") public class addAnswerControllerTest { TestRestTemplate restTemplate=new TestRestTemplate(); @Autowired private QuestionRepo questionRepo; @Before public void before(){ Question q1=new Question(); q1.setText("aaa"); Question q2=new Question(); q2.setText("bbb"); questionRepo.save(q1); questionRepo.save(q2); } @After public void after(){ questionRepo.deleteAll(); } @Test public void EditAnswer() { ResponseEntity<List<Question>> responseEntity= restTemplate.exchange("http://localhost:8080/faa", HttpMethod.GET, null, new ParameterizedTypeReference<List<Question>>() { }); List<Question> list=responseEntity.getBody(); assertThat(list.size(),is(2)); } } |
||||
7 окт 19, 11:51 [21988041] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
конфигруции я разделил теперь вопрос ,как при тесте автматически подымать приложение на тест конфигурации |
||
7 окт 19, 11:56 [21988049] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
вообщем я так понимаю чтобы данный тест заработал,нужно чтобы приложение стартануло на тестовой проперти-сделать это автоматически невозможно-ну откуда приложение при запуске знает ,что ты захочешь его тестировать,а если оно запущено то базу в рантайме поменять наверняка невозмжно при старте теста поэтому скорей всего решение одно- руками меняем одну проперть spring.datasource.url= с основы на тест и спокойно тестируем что душе угодно без всяких бубноплясок |
7 окт 19, 12:22 [21988082] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 50489 |
asv79, ты не запускаешь приложение. Ты запускаешь тестовые сценарии которые ПОДНИМАЮТ бины твоего приложения (поднимают правильно с зависимостями как ты и описал) только впихивают в них тестовые .properties. Есть второй сценарий когда часть бинов ты разделяешь на тестовые и продуктовые но попробуй сначала первый. Еще раз. Ты НЕ ПОДНИМАЕШЬ всё приложение. Ты тестируешь его КОМПОНЕНТЫ. |
7 окт 19, 12:24 [21988086] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
суть понял я должен как то запустить вот этот контроллер в внутри теста @RestController public class ControllerForTest { @Autowired private QuestionRepo questionRepo; @RequestMapping("/faa") public List<Question>sss(){ return questionRepo.findAll(); } } как это сделать? бин его сделать типо @Bean public ControllerForTest controllerForTest(){ return new ControllerForTest(); } а что дальше? |
||
7 окт 19, 12:39 [21988101] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
в гугле пишут что протестировать отдельно рест контроллер от приложения типо нельзя если только использовать моки-тогда вообще нет никакого смысла в тесте |
7 окт 19, 12:48 [21988113] Ответить | Цитировать Сообщить модератору |
mad_nazgul Member Откуда: Сообщений: 5609 |
Это не совсем так. Когда вы поднимаете контекст в рамках теста, то можно поднять все приложение, вместе с контроллерами и подключением к БД. Что по идее вам и нужно. Просто в это приложение нужно "подсунуть" тестовые конфиги. Т.к. я последнее время работаю со SprinBoot, то там все просто. Создаешь в тестовой папке каталог "resources" в нем файл application.properties |
||
7 окт 19, 13:14 [21988156] Ответить | Цитировать Сообщить модератору |
chpasha Member Откуда: Сообщений: 10222 |
твоя проблема в том, что ты не читаешь документацию. ты просто сразу шашку наголо и давай рубать код. так не делается. перед этим нужно взять и хоть раз проглядеть документацию того же спринг/спринг-бут. не для того чтобы запомнить все стопицот аннотаций, а для того чтобы отметить основные возможности. Кроме перечисленного в статье есть еще возможность передачи свойств извне, но это уже больше для CI годится и для runtime |
||
7 окт 19, 13:36 [21988187] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
это я понял ,а дальше что @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest @TestPropertySource(locations="classpath:application-test.properties") public class addAnswerControllerTest { TestRestTemplate restTemplate=new TestRestTemplate(); @Autowired private QuestionRepo questionRepo; @Before public void before(){ Question q1=new Question(); q1.setText("aaa"); Question q2=new Question(); q2.setText("bbb"); questionRepo.save(q1); questionRepo.save(q2); } @After public void after(){ questionRepo.deleteAll(); } @Test public void EditAnswer() { ResponseEntity<List<Question>> responseEntity= restTemplate.exchange("http://localhost:8080/faa", HttpMethod.GET, null, new ParameterizedTypeReference<List<Question>>() { }); List<Question> list=responseEntity.getBody(); assertThat(list.size(),is(2)); } } вот код теста как мне в нем прописать чтобы запускался внутри этого теста контроллер @RestController public class ControllerForTest { @Autowired private QuestionRepo questionRepo; @RequestMapping("/faa") public List<Question>sss(){ return questionRepo.findAll(); } } либо целиком все приложение вот в чем сейчас вопрос |
||||
7 окт 19, 13:38 [21988197] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
как использовать разные проперти для теста и для приложения я разобрался вопрос теперь в другом как запустить внутри теста приложение/рест контроллер |
||||
7 окт 19, 13:43 [21988207] Ответить | Цитировать Сообщить модератору |
chpasha Member Откуда: Сообщений: 10222 |
гуглится за секунду |
||
7 окт 19, 13:55 [21988236] Ответить | Цитировать Сообщить модератору |
chpasha Member Откуда: Сообщений: 10222 |
вдогонку к примеру дока |
7 окт 19, 13:56 [21988239] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
Хорошо,раз так идем и делаем как написано там вот что пишут там Also note that Spring Boot has provided a TestRestTemplate for you automatically, and all you have to do is @Autowired it. О чудо спринг бут все может,хорошо пишем как нас просят @Autowired private TestRestTemplate restTemplate; и конечно же получаем ошибку. есть ли смысл такие гайды дальше читать большущий вопрос org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.alekseev.Javatesting.Controller.addAnswerControllerTest': Unsatisfied dependency expressed through field 'restTemplate'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.boot.test.web.client.TestRestTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject что тут написано?правильно ровно противоположное тому,о чем так уверенно утверждают авторы гайда самое смешное -авторы сего гайда -ребята из спринг,которые сами не знают как работает их детище и это просто суперпечально |
||||
7 окт 19, 15:14 [21988370] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
chpasha,из той же песни - 80% туфты,как понять что работает а что нет? пс.ребят есть кто делает эти тесты ,без отсылок на всякие устаревшие гайды как мне мой тест то написать? |
7 окт 19, 15:16 [21988373] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
Все написал таки))@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) @TestPropertySource(locations="classpath:application-test.properties") public class addAnswerControllerTest { @Autowired private QuestionRepo questionRepo; private TestRestTemplate restTemplate=new TestRestTemplate(); @Before public void before(){ Question q1=new Question(); q1.setText("aaa"); Question q2=new Question(); q2.setText("bbb"); questionRepo.save(q1); questionRepo.save(q2); } @After public void after(){ questionRepo.deleteAll(); } @Test public void EditAnswer() { ResponseEntity<List<Question>> responseEntity= restTemplate.exchange("http://localhost:8080/faa", HttpMethod.GET, null, new ParameterizedTypeReference<List<Question>>() { }); List<Question> list=responseEntity.getBody(); assertThat(list.size(),is(2)); } } оказалось не хватало вот этой писюлины webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT |
7 окт 19, 15:23 [21988392] Ответить | Цитировать Сообщить модератору |
mayton Member Откуда: loopback Сообщений: 50489 |
Ты иногда - как базарная бабка. ![]() Стисни зубы и разбирайся... |
||
7 окт 19, 15:27 [21988402] Ответить | Цитировать Сообщить модератору |
asv79 Member Откуда: Тверь Сообщений: 3090 |
у меня просто жопа сгорает от конфигурирования,я хочу логикой заниматься ,а приходиться всякие проперти натягивать ,вот от этого прям реально пукан сгорает зачем я учил что такое хешмапа и как она заполняется ,если 90% времени я провожу на стаковерфлоу выискивая,как поставить очередной костыль,чтобы этот зоопарк технолгий заработал) вот смотри оказывается вообще все было правильно изначально у меня я положил тест проперти в папку тест ,спринг начал ругаться ,я полез на стак оверфлоу и ушел не в том направлении ,думая что у меня спринг не видит тестовых настроек,хотя он все видел,но не запускалось само приложение изза вот этой строчки @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) ПС.сейчас буду делать тоже самое но черех МОКИ,там не должно быть проблем,так как больно синтетический какой то тест/ |
||||
7 окт 19, 15:54 [21988439] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: ←Ctrl назад 1 2 3 [4] 5 6 7 8 9 10 .. 21 вперед Ctrl→ |
Все форумы / Java | ![]() |