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

在Micronaut中使用MockBean并为lambda应用程序使用lambda运行时

孙星鹏
2023-03-14

我有一个简单的Micronaut Lambda应用程序,很难成功地将Mocks注入到我的单元测试中。

build.gradle

micronaut {
    runtime("lambda")
    testRuntime("junit5")
    ...
}

具有以下基本控制器

java prettyprint-override">@Controller
public class MyController{

  Service service;

  @Inject
  public Controller controller(Service service){
    this.service = service;
  }
 
  @Post("/test")
  public void someEndpoint(){
    service.doSomething();
  }
}

以及以下测试类别:

@MicronautLambdaTest
public class MyControllerTest{

  @Inject
  Service service;

  @Inject
  @Client("/")
  RxHttpClient rxHttpClient;
  
  @MockBean(Service.class)
  Service service() {       
    return mock(Service.class);
  }

  @Test
  void should_do_something_when_something(){
    rxHttpClient.toBlocking().exchange(HttpRequest.POST("/test",""));
    verify(service, times(1)).doSomething();
  }
}

上面的测试将失败,因为模拟从未与之交互。

调试时,我可以看到服务在测试类本身中被模拟,但在MyController类中使用了一个实际的对象。

我注意到,当我不使用运行时("lambda")(例如运行时("netty"))时,这是预期的,所以我认为这与Lambda运行时有关,我希望有人能够指出我在正确的方向上。

共有1个答案

颜英博
2023-03-14

使用运行时(“lambda”)时,需要使用处理程序类启动测试,并删除@MicronautTest

MicronautLambdaHandler handler = new MicronautLambdaHandler();

这将启动应用程序上下文。

还可以使用Application ationContext.builder()传递参数

ApplicationContextBuilder config = ApplicationContext.builder()
                .environments("test");
MicronautLambdaHandler handler = new MicronautLambdaHandler(config);

使用@MicronautTest运行时(“lambda”)分别运行两组环境,这就是我删除@MicronautTest的原因。

如果你还想模拟课堂。您可以创建一个模拟类,并用@Replace(ClassToMock.class)@要求对其进行注释。对我来说是@要求(env=环境。测试).

对于不是接口实现的类,需要扩展要模拟的类(我使用的是v2.5.6)。


@Replaces(ClassToMock.class)
@Requires(env = Environment.TEST)
@Singleton
public class MockClass extends ClassToMock {

   @Override
   public void someMethod() {}
}

对于实现接口的类,您可以简单地创建另一个实现并对其进行类似的注释。

 类似资料:
  • 我有一个这样的处理程序和一个自定义注释@validrequest: 注释本身看起来是这样的: 而验证器是这样的: 问题是验证被完全忽略了。我可以发送任何事件有或没有身体和一切工作无一例外。我做的一切都是根据Micronout文档,会有什么问题吗? https://docs.micronaut.io/latest/guide/index.html#BeanValidation

  • 我一直在找这样的东西。 拥有此micronaut应用程序代码 如何将Spring的ApplicationContext与Micronaut的ApplicationContext合并。 问候

  • 我尝试用LocalStack运行lambda函数。我安装了awscli-local和localstack pip3安装awscli-local pip3安装--用户localstack--忽略-安装六个 然后我启动了localstack lamdba_executor=Docker本地堆栈启动--Docker 当我现在要创建lambda函数时 aws lambda create-function-

  • 问题内容: 在Python中,我试图按日期与lambda排序。我无法理解我的错误消息。消息是: 我的电话是 问题答案: 采用 在Python 2.x上,该函数按以下顺序使用其参数: 因此,如果没有,您传入的函数将被视为带有2个参数的函数。

  • 对于我的一个项目,我使用GLFW3。我试着给函数GLFWSetKeyCallback一个c11 lambda,它把一个GFLWwindow和一个GLFWfunkey函数作为参数,这是一个要作废的typedef(*GLFWkeyfun)(GLFWwindow*,int,int,int,int)。 该函数是从我的窗口类调用的,下面是代码 window.hpp 还有window.cpp 和来自编译器的错

  • Serverless 应用的一个不方便之处:缺少一个本地的调试环境。在之前的那篇《Serverless 架构应用开发:使用 serverless-offline 在本地部署与调试》中, 我们提到了使用 serverless-offline 插件来在本地部署和调试。在本文中,我们将介绍 serverless-plugin-simulate 插件来解决相似的问题。 serverless-plugin-