Skip to content

Feature/hw 07 spring data jpa#3

Open
uoles wants to merge 43 commits intomasterfrom
feature/hw-07-spring-data-jpa
Open

Feature/hw 07 spring data jpa#3
uoles wants to merge 43 commits intomasterfrom
feature/hw-07-spring-data-jpa

Conversation

@uoles
Copy link
Copy Markdown
Owner

@uoles uoles commented Jun 25, 2019

No description provided.

Maksim Kulikov and others added 30 commits April 22, 2019 16:08
- Методы выборки из таблицы книг.
- Добавление Spring Shell.
- Разделение методов на отдельные модули.
- Добавление тестов.
- Изменены запросы книг.
- Добавление внешних ключей для таблицы книг.
- Изменение сущности Book.
- Изменение типа id.
- Использование @jdbcTest.
- Изменение тестов.
- Доработка тестов.
- Связи OneToOne изменены на ManyToOne.
# Conflicts:
#	README.md
#	src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java
#	src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java
#	src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java
Maksim Kulikov and others added 8 commits June 21, 2019 17:57
- Добавление классов для обработки сущности Comment и покрытие тестами.
# Conflicts:
#	README.md
#	src/main/java/ru/otus/mkulikov/Application.java
#	src/main/java/ru/otus/mkulikov/app/dao/AuthorDao.java
#	src/main/java/ru/otus/mkulikov/app/dao/AuthorDaoJpa.java
#	src/main/java/ru/otus/mkulikov/app/dao/GenreDao.java
#	src/main/java/ru/otus/mkulikov/app/dao/GenreDaoJpa.java
#	src/main/java/ru/otus/mkulikov/app/service/AuthorManageServiceImpl.java
#	src/main/java/ru/otus/mkulikov/app/service/BookManageSeviceImpl.java
#	src/main/java/ru/otus/mkulikov/app/service/GenreManageServiceImpl.java
#	src/test/java/ru/otus/mkulikov/app/dao/AuthorDaoJpaTest.java
#	src/test/java/ru/otus/mkulikov/app/dao/BookDaoJpaTest.java
#	src/test/java/ru/otus/mkulikov/app/dao/GenreDaoJpaTest.java
#	src/test/resources/schema-test.sql
- Подключение liquibase.
*/

@DisplayName("Класс AuthorDaoJpa")
@RunWith(SpringRunner.class)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это не нужно (во всех тестах). Это для 4го JUnit. У вас JUnit5. Для него используется @ExtendWith({SpringExtension.class}), а он есть внутри @DataJpaTest

@ComponentScan("ru.otus.mkulikov.app")
@DataJpaTest
@TestPropertySource(locations= "classpath:application.yml")
class AuthorManageSeviceImplTest {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сервисы лучше тестировать безотносительно к БД, замокав Dao слой


Book getById(long id);

List<Book> getAllObjects();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если кастомный репозиторий сделан, чтобы решить N+1 проблему, то аналогичного результата, но с меньшим количеством кода, можно добиться с помощью использования @NamedEntityGraph

@Repository
public interface BookDaoCustom<T extends Book> {

Book getById(long id);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше вернуть Optional. Хотя бы даже для единообразия с JpaRepository


@Override
public long addBook(String caption, long authorId, long genreId, String description) {
Author author = authorDao.findById(authorId).get();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут и в других местах. Лучше использовать возможности Optional. Вместо get можно сделать orElseThrow или orElse/orElseGet.


assertAll(
"author",
() -> assertNotNull(author.get()),
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Для проверки Optional хорошо подходит assertThat из AssertJ

@DisplayName("Удаление автора, который используется в таблице книг")
void deleteObject() {
authorDao.deleteById(1L);
//assertThat(authorDao.count()).isEqualTo(1);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Над @DataJpaTest висит @Transactional. В тестах это значит, что все внутри метода будет выполнятся в транзакции, которая будет откачена после метода. Поэтому если хотите убедиться, что удаление автора не сработало это нужно делать как-то так

    @Test
    @DisplayName("Удаление автора, который используется в таблице книг")
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    void deleteObject() {
        assertThrows(DataIntegrityViolationException.class, () -> authorDao.deleteById(1L));
        assertThat(authorDao.count()).isEqualTo(3);
    }

@DataJpaTest
@DisplayName("Класс AuthorDaoJpa")
@ComponentScan("ru.otus.mkulikov.app")
@TestPropertySource(locations= "classpath:application.yml")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Все работает без @ComponentScan и @TestPropertySource

*/

@DisplayName("Класс AuthorManageSevice")
@TestPropertySource(locations= "classpath:application.yml")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут @TestPropertySource вроде как тоже не нужно. Ну и можно тестировать через @SpringBootTest, чтобы из контекста бины доставать (в т.ч. моки). Так как у вас конечно даже лучше) Но у нас курс по спрингу. Желательно пробовать чаще использовать его (спринга) технологии


@Repository
public interface BookDao extends JpaRepository<Book, Long>, BookDaoCustom<Book> {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

    @EntityGraph("BookGraph")
    List<Book> findAll();

    @EntityGraph("BookGraph")
    Optional<Book> findById(long id);

@Transactional(propagation = Propagation.NOT_SUPPORTED)
void deleteObject() {
assertThrows(DataIntegrityViolationException.class, () -> authorDao.deleteById(1L));
assertThat(authorDao.count()).isEqualTo(3);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Магические числа и строки лучше сделать константами

assertAll(
"author",
() -> assertNotNull(author_selected),
() -> assertEquals(4, author_selected.orElse(null).getId()),
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

И все же assertJ подошел бы лучше

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants