Должны ли мы написать модульный тест и интеграционный тест для уровня хранилища в Spring Boot? - PullRequest
1 голос
/ 08 марта 2019

У меня есть куча вопросов относительно Spring Boot слоя хранилища.

Мои вопросы:

  1. Должны ли мы даже написать модульный тест и интеграционный тест для уровня репозитория в Spring Boot, который не имеет никакого пользовательского кода или запроса?
  2. Как лучше всего написать интеграционный тест для уровня репозитория в Spring Boot? Я перечислил оба подхода ниже. Среди обоих подходов какой из них лучше. Есть ли лучшая практика, когда я должен следовать один за другим?
  3. Если ответ на мой вышеупомянутый вопрос № 1 - да, то как мне написать модульный тест для уровня хранилища в Spring Boot?

CurrencyRepository.java

@Repository
public interface CurrencyRepository extends CrudRepository<Currency, String> {

}

Поскольку здесь используется встроенная база данных H2, это интеграционный тест, а не модульный тест. Правильно ли мое понимание?

CurrencyRepositoryIntegrationTest.java (подход 1)

@RunWith(SpringRunner.class)
@DataJpaTest
public class CurrencyRepositoryIntegrationTest {

    @Autowired
    private TestEntityManager entityManager;
    @Autowired
    private CurrencyRepository repository;

    @Test
    public void testFindByName() {
        entityManager.persist(new Currency("USD", "United States Dollar", 2L));
        Optional<Currency> c = repository.findById("USD");
        assertEquals("United States Dollar", c.get().getCcyNm());
    }

}

CurrencyRepositoryIntegrationTest2.java (подход 2)

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class CurrencyRepositoryIntegrationTest2 {

    @Autowired
    private CurrencyRepository repository;

    @Test
    public void testFindByName() {
        repository.save(new Currency("USD", "United States Dollar", 2L));
        Optional<Currency> c = repository.findById("USD");
        assertEquals("United States Dollar", c.get().getCcyNm());
    }

}

1 Ответ

2 голосов
/ 08 марта 2019

Для интеграционного теста есть старая поговорка «Не издевайся над тем, чем не владеешь». Смотрите, например https://markhneedham.com/blog/2009/12/13/tdd-only-mock-types-you-own/ и https://8thlight.com/blog/eric-smith/2011/10/27/thats-not-yours.html

Тест JUnit, который вы напишете, будет имитировать базовый EntityManger для проверки правильности реализации Spring. Это тест, который, мы надеемся, уже есть у весенних разработчиков, поэтому я бы не стал его повторять.

Для теста интеграции, я думаю, вам все равно, как или если хранилище использует EntityManager внизу. Вы просто хотите посмотреть, правильное ли это поведение. Так что второй подход подходит лучше.

...