#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 должно сделать свое дело