Micronaut-data mocking CrudRepository с помощью Микронавт-теста
Я пытаюсь написать UnitTest для моего контроллера API, который использует CrudRepository из micronaut-data-jpa. Я использую @MockBean, чтобы смоделировать совместное хранилище в моем контроллере. Если я запускаю тест, я получаю следующую ошибку:
Message: No such method [findById(java.lang.Object) ] for bean [jens.repositories.ConnectionProfileRepository]
Я никогда не использовал Spock, Micronaut-Data или Micronaut-Test и пробовал только из следующего источника:
https://micronaut-projects.github.io/micronaut-test/latest/guide/index.html
контроллер:
ConnectionProfileRepository profileRepository
ProfilesController(ConnectionProfileRepository profileRepository) {
this.profileRepository = profileRepository
}
Язык: Groovy Репозиторий
interface ConnectionProfileRepository extends CrudRepository<ConnectionProfile, UUID> { }
Контрольная работа
@MicronautTest
class ProfilesControllerSpec extends Specification {
@Inject
ConnectionProfileRepository profilesRepositoryMock
@MockBean(ConnectionProfileRepository.class)
ConnectionProfileRepository profileRepository() {
Mock(ConnectionProfileRepository)
}
...
Как я могу с моей текущей настройкой добиться макета для хранилища в моем контроллере?
0 ответов
См. Проект по адресу https://github.com/jeffbrown/mockmdrepository.
package mockmdrepository;
import io.micronaut.data.jdbc.annotation.JdbcRepository;
import io.micronaut.data.model.query.builder.sql.Dialect;
import io.micronaut.data.repository.CrudRepository;
@JdbcRepository(dialect = Dialect.H2)
public interface ProfileRepository extends CrudRepository<Profile, Long> { }
package mockmdrepository;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import java.util.Optional;
@Controller("/profiles")
public class ProfilesController {
private final ProfileRepository profileRepository;
public ProfilesController(ProfileRepository profileRepository) {
this.profileRepository = profileRepository;
}
@Get("/")
public Iterable<Profile> index() {
return profileRepository.findAll();
}
@Get("/{id}")
public Optional<Profile> get(Long id) {
return profileRepository.findById(id);
}
}
package mockmdrepository
import io.micronaut.context.annotation.Replaces
import io.micronaut.http.HttpResponse
import io.micronaut.http.client.RxHttpClient
import io.micronaut.http.client.annotation.Client
import io.micronaut.test.annotation.MicronautTest
import io.micronaut.test.annotation.MockBean
import spock.lang.AutoCleanup
import spock.lang.Shared
import spock.lang.Specification
import javax.inject.Inject
@MicronautTest
class ProfilesControllerSpec extends Specification {
@Shared @AutoCleanup @Inject @Client("/")
RxHttpClient client
@Inject
ProfileRepository repository
void "test index"() {
when:
1 * repository.findAll() >> [new Profile('Profile 1'), new Profile('Profile 2')]
HttpResponse<Iterable<Profile>> response = client.toBlocking().exchange("/profiles", Iterable)
then:
response.body().size() == 2
}
void "test get"() {
when:
1 * repository.findById(42) >> Optional.of(new Profile('Profile Forty Two'))
HttpResponse<Iterable<Profile>> response = client.toBlocking().exchange("/profiles/42", Profile)
then:
response.body().name == 'Profile Forty Two'
}
@MockBean
@Replaces(ProfileRepository)
ProfileRepository mockRepo() {
Mock(ProfileRepository)
}
}
Я думаю, вам, вероятно, нужно внедрить репозиторий crud через член экземпляра в вашем контроллере, а не через конструктор. По крайней мере, у меня это работает. У меня код Java, Groovy, вероятно, должен быть таким же.
В контроллере:
@Inject
ParameterRepository parameterRepository;
В тесте:
@MockBean(ParameterRepository.class)
ParameterRepository parameterRepository() {
return mock(ParameterRepository.class);
}
@Inject
ParameterRepository parameterRepository;