我尝试为我的API控制器编写UnitTest,该控制器使用micronaut-data-jpa中的CrudRepository。我使用@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 :(得分:0)
查看位于https://github.com/jeffbrown/mockmdrepository的项目。
RequestContext
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);
}
}
答案 1 :(得分:-1)
我认为您可能需要通过控制器中的实例成员注入Crud存储库,而不是构造函数注入。至少对我有用。我的是Java代码,groovy应该差不多。
在控制器中:
@Inject
ParameterRepository parameterRepository;
在测试中:
@MockBean(ParameterRepository.class)
ParameterRepository parameterRepository() {
return mock(ParameterRepository.class);
}
@Inject
ParameterRepository parameterRepository;