Как протестировать класс репозитория, который содержит другой класс репозитория, который был протестирован отдельно?

#java #spring #testing #junit

Вопрос:

У меня есть класс UrlRepositoryImpl, который я хочу протестировать:

 @Repository
public class UrlRepositoryImpl implements UrlRepository {

    private final File urlsDatabase;

    private final UserUrlRepository userUrlRepository;

    @Autowired
    public UrlRepositoryImpl(@Qualifier("urlsDatabase") File urlsDatabase, UserUrlRepository userUrlRepository) {
        this.urlsDatabase = urlsDatabase;
        this.userUrlRepository = userUrlRepository;
    }

    ... some of the methods use userUrlRepository, for example:
    void someMethod() {
         userUrlRepository.save(
                new UserUrl(userUrlRepository.getAvailableId(), url.getOwner().getId(), url.getId())
              );
    }
}
 

С другой стороны, у меня есть:

 @Repository
public class UserUrlRepositoryImpl implements UserUrlRepository {

    private final File user_urlDatabase;

    @Autowired
    public UserUrlRepositoryImpl(@Qualifier("user_urlDatabase") File user_urlDatabase) {
        this.user_urlDatabase = user_urlDatabase;
    }

    ...some methods...
}
 

Я протестировал UserUrlRepository без каких-либо проблем, но я хочу протестировать свой URL-адрес, фактически не работая с UserUrlRepository (фактически не записывая его в свою файловую базу данных и так далее).

Я попытался протестировать его таким образом (утверждает, что сейчас просто ничего не делает, потому что я хочу, чтобы мой пользователь на самом деле не писал в базу данных, но он все равно пишет):

 @SpringBootTest
@Import(TestConfig.class)
@ActiveProfiles({ "test" })
public class UrlRepositoryTest {

    @Mock
    private UserUrlRepository userUrlRepository;

    @InjectMocks
    @Autowired
    private UrlRepositoryImpl urlRepository;

    @BeforeEach
    void clearDB() {
        urlRepository.deleteAll();
    }

    @Test
    public void testSaveNewUrl() {
        User user = new User();
        user.setId(10L);

        Url url = new Url();
        url.setId(1);
        url.setOwner(user);
        url.setPath("https://example.com");

        UserUrl userUrl = new UserUrl(1, 10, 1);

        when(userUrlRepository.getAvailableId()).thenReturn(1L);
        when(userUrlRepository.save(any(UserUrl.class))).thenReturn(userUrl);

        Url expected = urlRepository.save(url);

        assertEquals(1, 1);
        verify(userUrlRepository, times(1)).save(any(UserUrl.class));
    }

}
 

В результате я получаю эти ошибки:
введите описание изображения здесь

и user_url.csv был написан пользователем UserUrlRepository, но я хочу, чтобы он на самом деле ничего не писал и не делал : введите описание изображения здесь

Комментарии:

1. Изменение mock на mockbean должно сделать свое дело