Хранилище пружинных юнит-тестов не работает - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь написать модульный тест для моего весеннего сервера.

Сначала он проверит, присутствует ли имя пользователя в репозитории или нет, если нет, то имя пользователя доступно, затем он вернется Значение true, а затем я сохраню это имя пользователя в своем хранилище и проверим, если оно доступно, или не должно возвращать значение false.

Вот мой код:

@Test
    public void availableTest() {
        String username="some_username";
        LoginCredential lc=new LoginCredential();
        lc.setUsername(username);
        lc.setPasswordHash("1");
        lc.setSessionID(0);
        assertEquals(true, loginCredentialService.available(username));
        loginCredentialRepository.save(lc);
        assertEquals(false, loginCredentialService.available(username));
    }

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

Так как это можно решить?

Я думаю, класс тестирования правильно помечен:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MainApplicationTests {

    @Autowired
    private LoginCredentialService loginCredentialService;

    @MockBean
    private LoginCredentialRepository loginCredentialRepository;
    ...

1 Ответ

1 голос
/ 07 января 2020

Вы пометили OP как H2, так что, я думаю, вы знаете о базах данных In-Memory.

Если вы используете аннотацию @SpringBootTest, вы пишете интеграционный тест, поэтому вы протестируете полное приложение как связано весной. Для эффективности вы можете использовать базу данных в памяти вместо полного SQL сервера.

Этого можно добиться, добавив базу данных H2 в качестве тестовой зависимости, которая будет выбрана Spring Boot для интеграции тестовых репозиториев. Затем вы можете ввести реальный репозиторий:

@Autowired
private LoginCredentialRepository loginCredentialRepository;

Дополнительно, вы можете сделать свой тест @Transactional. Затем каждый тестовый случай будет выполняться в отдельной транзакции, и транзакция будет откатываться после каждого теста, поэтому вам не нужно беспокоиться о перекрестном тестировании.

Если вы просто хотите выполнить модульное тестирование LoginCredentialService, вам нужно заглушить соответствующие методы в хранилище, например,

@MockBean
private LoginCredentialRepository loginCredentialRepository;

@Test
public void availableTest1() {
    when(loginCredentialRepository.existByName(username)).thenReturn(true);
    assertEquals(false, loginCredentialService.available(username));
}

@Test
public void availableTest2() {
    when(loginCredentialRepository.existByName(username)).thenReturn(false);
    assertEquals(true, loginCredentialService.available(username));
}

Вы также можете сделать это как чистый тест Mockito без @ SpringBootTest.

...