Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 [4] 5 6 7 8 9 10 .. 21   вперед  Ctrl
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
mayton
asv79
и вот в этом проблема ,так как я перерыл весь гугл и не нашел как тестировать постргресс ,эти товарищи не предоставили такой возможности,есть какие то интсрументы типо яндекса ,но я так и не понял как оно все пашет)


Почитай про SpringData Repos

https://docs.spring.io/spring-data/data-commons/docs/2.2.0.RELEASE/reference/html/#repositories

я это все уже давно читал,там ничего нового нет для,про тесты там ничего нет,НЕ спроста энтузиасты свои либы пищут чтобы можно было без костылей тестить jpa на постргресе
4 окт 19, 22:42    [21987176]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
chpasha
asv79
я перерыл весь гугл и не нашел как тестировать постргресс

объясняется это просто - ты зациклился на том, что тесты должны быть на embedded базе. если откинуть это условие, то ответ становится очевиден - тестируют на тестовой не embedded базе той же версии, что и рабочая. У тебя ведь url БД - это настройка, для тестов ее можно поменять и/или передавать извне в качестве параметра

аа спасибо)) блин еще и ноут с огорчухи на работе забыл,щас бы затестил)
4 окт 19, 22:43    [21987178]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
chpasha
У тебя ведь url БД - это настройка, для тестов ее можно поменять и/или передавать извне в качестве параметра


вот в этом и загвоздка,где и как прописать ,что для тестов мы используем другую базу

я создал в папке 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]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
если же анотацию @TestPropertySource(locations = "test/resources/application.properties")
убрать то тест работает на основной базе

вот и получается простой вопрос где и как указать спрингу ,чтобы он использовал настройки для теста,а не для приложения обычного
7 окт 19, 10:40    [21987992]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
вообще конечно ничего не понятно

прежде чем запустить тест я должен запустить основное приложение,оно же не знает что сейчас будет тест- и запускается на тех настройках,какие по дефолту
-соотвсвтенно там база данных не тестовая далеко,а самая обычная

далее я запускаю тест -который ожидает что приложение работает на тест базе ,а не на основной ,кладу в эту базу что то и естесственно получаю фейл,так как в тестовой базе даже таблица не создается

что то не то тут явно -где то суть я утерял этих тестов судя по всему
7 окт 19, 11:11    [21988007]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
а нет вру)
все таки тестовая база создалась,но тест проваливается,так как я обращаюсь к контроллеру который берет значение из основной базы
а тест происходит тестовой базе

получается нужно изначально чтобы приложение стартовало на тест базе?получатеся в автоматическом режиме никак?
тоесть нужно руками постоянно менять проперть?
7 окт 19, 11:15    [21988011]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5078
asv79
а нет вру)
все таки тестовая база создалась,но тест проваливается,так как я обращаюсь к контроллеру который берет значение из основной базы
а тест происходит тестовой базе

получается нужно изначально чтобы приложение стартовало на тест базе?получатеся в автоматическом режиме никак?
тоесть нужно руками постоянно менять проперть?



Э-э-э а почему в тесте нельзя поднять контекст вместе с контроллером и обращаться из теста к нему?
7 окт 19, 11:39    [21988030]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
mayton
Member

Откуда: loopback
Сообщений: 44288
asv79, твои сорцы уже секретные? Есть масса способов разделить конфигурации. По сути на твой вопрос - есть
миллион ответов. Все они - экспертные. И имеют разную сложность в реализации. Чтоб сказать уверенно
что тебе надо сделать - лучше всего видеть с чем мы боремся.
7 окт 19, 11:51    [21988039]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
mad_nazgul
asv79
а нет вру)
все таки тестовая база создалась,но тест проваливается,так как я обращаюсь к контроллеру который берет значение из основной базы
а тест происходит тестовой базе

получается нужно изначально чтобы приложение стартовало на тест базе?получатеся в автоматическом режиме никак?
тоесть нужно руками постоянно менять проперть?



Э-э-э а почему в тесте нельзя поднять контекст вместе с контроллером и обращаться из теста к нему?

знать бы как это делать

вот мой рест контроллер
@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]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
mayton
asv79, твои сорцы уже секретные? Есть масса способов разделить конфигурации. По сути на твой вопрос - есть
миллион ответов. Все они - экспертные. И имеют разную сложность в реализации. Чтоб сказать уверенно
что тебе надо сделать - лучше всего видеть с чем мы боремся.

конфигруции я разделил
теперь вопрос ,как при тесте автматически подымать приложение на тест конфигурации
7 окт 19, 11:56    [21988049]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
вообщем я так понимаю чтобы данный тест заработал,нужно чтобы приложение стартануло на тестовой проперти-сделать это автоматически невозможно-ну откуда приложение при запуске знает ,что ты захочешь его тестировать,а если оно запущено то базу в рантайме поменять наверняка невозмжно при старте теста
поэтому скорей всего решение одно-

руками меняем одну проперть
spring.datasource.url=
с основы на тест и спокойно тестируем что душе угодно без всяких бубноплясок
7 окт 19, 12:22    [21988082]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
mayton
Member

Откуда: loopback
Сообщений: 44288
asv79, ты не запускаешь приложение. Ты запускаешь тестовые сценарии которые ПОДНИМАЮТ бины
твоего приложения (поднимают правильно с зависимостями как ты и описал) только впихивают
в них тестовые .properties.

Есть второй сценарий когда часть бинов ты разделяешь на тестовые и продуктовые но попробуй сначала
первый.

Еще раз. Ты НЕ ПОДНИМАЕШЬ всё приложение.

Ты тестируешь его КОМПОНЕНТЫ.
7 окт 19, 12:24    [21988086]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
mayton
asv79, ты не запускаешь приложение. Ты запускаешь тестовые сценарии которые ПОДНИМАЮТ бины
твоего приложения (поднимают правильно с зависимостями как ты и описал) только впихивают
в них тестовые .properties.

Есть второй сценарий когда часть бинов ты разделяешь на тестовые и продуктовые но попробуй сначала
первый.

Еще раз. Ты НЕ ПОДНИМАЕШЬ всё приложение.

Ты тестируешь его КОМПОНЕНТЫ.

суть понял
я должен как то запустить вот этот контроллер в внутри теста
@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]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
в гугле пишут что протестировать отдельно рест контроллер от приложения типо нельзя

если только использовать моки-тогда вообще нет никакого смысла в тесте
7 окт 19, 12:48    [21988113]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5078
asv79
в гугле пишут что протестировать отдельно рест контроллер от приложения типо нельзя

если только использовать моки-тогда вообще нет никакого смысла в тесте


Это не совсем так.
Когда вы поднимаете контекст в рамках теста, то можно поднять все приложение, вместе с контроллерами и подключением к БД.
Что по идее вам и нужно.
Просто в это приложение нужно "подсунуть" тестовые конфиги.

Т.к. я последнее время работаю со SprinBoot, то там все просто.
Создаешь в тестовой папке каталог "resources" в нем файл application.properties
7 окт 19, 13:14    [21988156]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
chpasha
Member

Откуда:
Сообщений: 8752
asv79
ну откуда приложение при запуске знает ,что ты захочешь его тестировать

твоя проблема в том, что ты не читаешь документацию. ты просто сразу шашку наголо и давай рубать код. так не делается. перед этим нужно взять и хоть раз проглядеть документацию того же спринг/спринг-бут. не для того чтобы запомнить все стопицот аннотаций, а для того чтобы отметить основные возможности. Кроме перечисленного в статье есть еще возможность передачи свойств извне, но это уже больше для CI годится и для runtime
7 окт 19, 13:36    [21988187]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
mad_nazgul
asv79
в гугле пишут что протестировать отдельно рест контроллер от приложения типо нельзя

если только использовать моки-тогда вообще нет никакого смысла в тесте


Это не совсем так.
Когда вы поднимаете контекст в рамках теста, то можно поднять все приложение, вместе с контроллерами и подключением к БД.
Что по идее вам и нужно.
Просто в это приложение нужно "подсунуть" тестовые конфиги.

Т.к. я последнее время работаю со SprinBoot, то там все просто.
Создаешь в тестовой папке каталог "resources" в нем файл application.properties

это я понял ,а дальше что

@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]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
chpasha
asv79
ну откуда приложение при запуске знает ,что ты захочешь его тестировать

твоя проблема в том, что ты не читаешь документацию. ты просто сразу шашку наголо и давай рубать код. так не делается. перед этим нужно взять и хоть раз проглядеть документацию того же спринг/спринг-бут. не для того чтобы запомнить все стопицот аннотаций, а для того чтобы отметить основные возможности. Кроме перечисленного в статье есть еще возможность передачи свойств извне, но это уже больше для CI годится и для runtime

как использовать разные проперти для теста и для приложения я разобрался
вопрос теперь в другом
как запустить внутри теста приложение/рест контроллер
7 окт 19, 13:43    [21988207]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
chpasha
Member

Откуда:
Сообщений: 8752
asv79
как запустить внутри теста приложение/рест контроллер

гуглится за секунду
7 окт 19, 13:55    [21988236]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
chpasha
Member

Откуда:
Сообщений: 8752
вдогонку к примеру дока
7 окт 19, 13:56    [21988239]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
chpasha
asv79
как запустить внутри теста приложение/рест контроллер

гуглится за секунду

Хорошо,раз так идем и делаем как написано там

вот что пишут там

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]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
chpasha,из той же песни - 80% туфты,как понять что работает а что нет?

пс.ребят есть кто делает эти тесты ,без отсылок на всякие устаревшие гайды

как мне мой тест то написать?
7 окт 19, 15:16    [21988373]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
Все написал таки))

@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]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
mayton
Member

Откуда: loopback
Сообщений: 44288
asv79
что тут написано?правильно ровно противоположное тому,о чем так уверенно утверждают авторы гайда

самое смешное -авторы сего гайда -ребята из спринг,которые сами не знают как работает их детище и это просто суперпечально

Ты иногда - как базарная бабка.

Стисни зубы и разбирайся...
7 окт 19, 15:27    [21988402]     Ответить | Цитировать Сообщить модератору
 Re: Junit тестирование простейшего контроллера  [new]
asv79
Member

Откуда: Тверь
Сообщений: 2806
mayton
asv79
что тут написано?правильно ровно противоположное тому,о чем так уверенно утверждают авторы гайда

самое смешное -авторы сего гайда -ребята из спринг,которые сами не знают как работает их детище и это просто суперпечально

Ты иногда - как базарная бабка.

Стисни зубы и разбирайся...


у меня просто жопа сгорает от конфигурирования,я хочу логикой заниматься ,а приходиться всякие проперти натягивать ,вот от этого прям реально пукан сгорает

зачем я учил что такое хешмапа и как она заполняется ,если 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 Ответить