使用Micronaut测试对Micronaut数据进行模拟CrudRepository

时间:2019-08-02 14:10:18

标签: micronaut micronaut-data

我尝试为我的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)
    }
...

如何使用当前设置进行管理以实现控制器中存储库的模拟?

2 个答案:

答案 0 :(得分:0)

查看位于https://github.com/jeffbrown/mockmdrepository的项目。

https://github.com/jeffbrown/mockmdrepository/blob/fe7ce34e526663455f6b4322fc38bed2ddcf11dc/src/main/java/mockmdrepository/ProfileRepository.java

RequestContext

https://github.com/jeffbrown/mockmdrepository/blob/fe7ce34e526663455f6b4322fc38bed2ddcf11dc/src/main/java/mockmdrepository/ProfilesController.java

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> { }

https://github.com/jeffbrown/mockmdrepository/blob/fe7ce34e526663455f6b4322fc38bed2ddcf11dc/src/test/groovy/mockmdrepository/ProfilesControllerSpec.groovy

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;