首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Micronaut使用Micronaut- CrudRepository模拟数据测试

Micronaut使用Micronaut- CrudRepository模拟数据测试
EN

Stack Overflow用户
提问于 2019-08-02 22:10:19
回答 2查看 1.9K关注 0票数 2

我尝试为我的应用程序接口控制器编写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

控制器:

代码语言:javascript
复制
ConnectionProfileRepository profileRepository

    ProfilesController(ConnectionProfileRepository profileRepository) {
        this.profileRepository = profileRepository
    }

语言: Groovy Repository

代码语言:javascript
复制
interface ConnectionProfileRepository extends CrudRepository<ConnectionProfile, UUID> { }

测试

代码语言:javascript
复制
@MicronautTest
class ProfilesControllerSpec extends Specification {

    @Inject
    ConnectionProfileRepository profilesRepositoryMock

    @MockBean(ConnectionProfileRepository.class)
    ConnectionProfileRepository profileRepository() {
        Mock(ConnectionProfileRepository)
    }
...

如何使用当前的设置在控制器中实现存储库的模拟?

EN

回答 2

Stack Overflow用户

发布于 2019-12-24 02:38:35

请访问https://github.com/jeffbrown/mockmdrepository查看该项目。

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

代码语言:javascript
复制
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/main/java/mockmdrepository/ProfilesController.java

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
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)
    }
}
票数 4
EN

Stack Overflow用户

发布于 2019-10-04 14:14:29

我认为您可能需要通过控制器中的实例成员注入crud存储库,而不是通过构造函数注入。至少它对我来说是有效的。我的是java代码,groovy应该也是这样。

在控制器中:

代码语言:javascript
复制
   @Inject
    ParameterRepository parameterRepository;

在测试中:

代码语言:javascript
复制
    @MockBean(ParameterRepository.class)
    ParameterRepository parameterRepository() {
        return mock(ParameterRepository.class);
    }

    @Inject
    ParameterRepository parameterRepository;
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57328163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档