当前位置: 首页 > 知识库问答 >
问题:

使用Micronaut-test模拟CrudRepository的Micronaut-data

任繁
2023-03-14

我尝试为API控制器编写UnitTest,它使用来自micronaut-data-jpa的CrudRepository。我使用@mockbean来模拟控制器中的协作存储库。如果我运行测试,我会得到以下错误:

消息:bean[jens.repositories.connectionProfileRepository]没有这样的方法[findById(java.lang.object)]

我从未使用过Spock、Micronaut-Data或Micronaut-Test,只从以下来源尝试过:

https://micronaut-projects.github.io/micronaut-test/latew/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)
    }
...

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

共有1个答案

佘缪文
2023-03-14

请参阅https://github.com/jeffbrown/mockmdrepository上的项目。

https://github.com/jeffbrown/mockmdrepository/blob/fe7ce34e526663455f6b4322fc38bed2ddcf11dc/src/main/Java/mockmdrepository/profileRepository.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/main/Java/mockmdrepository/profilescontroller.Java

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

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)
    }
}
 类似资料:
  • Grails 框架作者的最新力作,Micronaut 是一个新一代基于 JVM 的全栈的微服务框架,用于构建模块化的、易于测试的微服务应用。 Micronaut 的灵感来自于这些年作者使用 Spring、Spring Boot 和 Grails 构建从大型应用到服务应用的经历。 Micronaut 旨在提供所有构建微服务应用必要的工具,包括: 依赖注入和控制反转 (IoC) 规范优于配置和自动配置

  • 是否有任何示例项目展示了如何将Kafka与Micronaut结合使用?我很难让它工作。 我有以下制片人: 听众: 我的申请。yml包含: 以及应用测试。yml(这是正确的吗?它应该与application.yml位于同一目录中吗?还不确定嵌入式服务器应该如何使用): 我的测试结果如下: 我面临的主要问题是: > 我的消费者没有从我的主题中消费。我可以看到制作者在Kafka中创建了主题,并且创建了客

  • 我有一个提供REST API的Grails 4应用程序。其中一个endpoint有时会出现以下异常而失败: endpoint使用micronaut http客户端调用其他系统。远程系统需要很长时间才能响应,导致ReadTimeOutException。 以下是调用远程服务的代码: 我尝试在application.yml中使用以下配置解决它: 和 ...没有成功。尽管我进行了配置,但在调用endpo

  • Micronaut Micronaut is a modern, JVM-based, full stack Java framework designed for building modular, easily testable JVM applications with support for Java, Kotlin and the Groovy language. Micronaut i

  • 我需要执行从Micronaut到Spring应用程序的远程调用。为了创建必要的bean,我创建了一个工厂: 在我的Spock集成测试中,我需要模拟这些bean,我根据Micronaut文档进行了尝试:https://docs.micronaut.io/latest/guide/index.html#replaces 这导致了这样的测试: 这个解决方案效果不佳。如果这两个测试是单独运行的,那么这两个

  • 更新:链接到repo被移动到回答,因为repo现在使用下面回答中的代码更新。 问题描述 当前代码正在运行,但它正在使用谷歌/云sdk的gcloud测试版模拟器pubsub进行集成测试。 由于google/cloud d-sdk映像的大小,集成测试很慢 pubsub模拟器必须在固定端口上运行,似乎没有办法告诉Micronaut模拟器在哪个端口上运行 我需要在maven surefire插件中设置以下