[{"data":1,"prerenderedAt":402},["ShallowReactive",2],{"content-svc-lambda-guides-effectively-running-java-on-serverless-unit":3},{"markdown":4,"frontMatterAttributes":5,"bodyRaw":19,"menu":20,"menuType":393,"isCollapseableMenu":23,"nextDocItem":270,"previousDocItem":252,"contributorPaths":394,"contentName":401,"slug":269,"readingTime":118},"\u003Cp>Unit tests validate individual units of your code in isolation, \nhence independently of any other components such as DynamoDb or API Gateway. \u003C\u002Fp>\n\u003Cp>To facilitate unit test of the handler function, move as much of logic as possible to other functions that are then \ncalled by the Lambda handler entry point. \nIn our example, we delegate the persistence of the ticket to the method \u003Ccode>ddbUtils.persistTicket(ticket)\u003C\u002Fcode> of the class \u003Ccode>DDBUtils\u003C\u002Fcode>. \nThe purpose of the \u003Ccode>DDBUtils\u003C\u002Fcode> class is to wrap all the API calls to DynamoDB.\u003C\u002Fp>\n\u003Ch4>Mocking AWS API Calls\u003C\u002Fh4>\n\u003Cp>In the production code, we need to create a real DynamoDB client to interact with DynamoDB. \nThe test code instead being performed in isolation, \ndoes not require any interaction with a real database. \nBy mocking an instance of \u003Ccode>DDBUtils\u003C\u002Fcode>, we can simulate the positive and negative scenarios using the client.\u003C\u002Fp>\n\u003Cp>To allow both production and test code execution, we need to define a constructor which takes an instance of \u003Ccode>ddbUtils\u003C\u002Fcode> as argument. \u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">public class TicketFunction {\n  private DDBUtils ddbUtils;\n\n  public TicketFunction(DDBUtils ddbUtils) {\n    if (ddbUtils == null) {\n      DynamoDbClient ddb = DDBUtils.getDynamoDbClient();\n      DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()\n        .dynamoDbClient(ddb)\n        .build();\n      this.ddbUtils = new DDBUtils(enhancedClient);\n    } else {\n      this.ddbUtils = ddbUtils;\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The test code will create a mocked instance of \u003Ccode>DDBUtils\u003C\u002Fcode> and pass it to the \u003Ccode>TicketFunction\u003C\u002Fcode> constructor; instead \nthe production code will pass null to the TicketFunction constructor so that it created the \u003Ccode>DynamoDbClient\u003C\u002Fcode> and \u003Ccode>DynamoDbEnhancedClient\u003C\u002Fcode>. \nWhen Lambda instantiates the \u003Ccode>TestFunction\u003C\u002Fcode>, it calls the default constructor without any argument, therefore, \nwe need to override the default constructor to invoke the constructor which we just defined passing null as input:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">public TicketFunction() {\n  this(null);\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>To write our unit tests, we will use JUnit, which provides handy assertions and annotations for our tests, and \u003Ca href=\"https:\u002F\u002Fsite.mockito.org\u002F\">Mockito\u003C\u002Fa>, \na popular Java framework that we can use to mock the AWS Services API calls wrapped in the \u003Ccode>DDBUtils\u003C\u002Fcode> class.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">public class TicketFunctionMockTest {\n\n  @Mock\n  private transient DDBUtils testUtils;\n  \n  private TicketFunction function;\n  \n  @BeforeEach\n  public void beforeEach() {\n    MockitoAnnotations.openMocks(this);\n    function = new TicketFunction(testUtils);\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Before each test we instantiate a new TicketFunction with the mocked DDBUtils class, so that we can inject a custom \nbehavior in the persistTicket method. For example, the following statement that it will tell the mock to return a \nspecific uuid when the \u003Ccode>DDBUtils.persistTicket()\u003C\u002Fcode> method is called.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">Mockito.when(\n  testUtils.persistTicket(\n    Mockito.any(Ticket.class)\n  )\n)\n.thenReturn(uuid);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Mocking integrations with other AWS Services\u003C\u002Fh4>\n\u003Cp>So far we have seen how to mock classes we defined to wrap API calls to AWS Services such as DynamoDB, \nbut the behavior of our Lambda function varies depending on the input events received from other AWS Services, \nAPI Gateway in our example.\u003C\u002Fp>\n\u003Cp>Our unit tests then can feed custom input events to our Lambda Function and test the behavior in isolation as we are \nmocking any API call to AWS Services. \nIt is the best practice to define these input events as json files stored in the \u003Ccode>src\u002Ftest\u002Fresources\u002Fevents\u003C\u002Fcode> folder.\u003C\u002Fp>\n\u003Cp>We will use the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws\u002Faws-lambda-java-libs\u002Ftree\u002Fmain\u002Faws-lambda-java-tests\">aws-lambda-java-tests\u003C\u002Fa> library to seamlessly load \nand deserialize JSON events and inject them in your tests.\u003C\u002Fp>\n\u003Cp>The \u003Ccode>@Event\u003C\u002Fcode> annotation provides loaders for the most common event types available in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws\u002Faws-lambda-java-libs\u002Ftree\u002Fmain\u002Faws-lambda-java-events\">aws-lambda-java-events\u003C\u002Fa>. \nIt requires the path of a json file with the event definition from the \u003Ccode>src\u002Ftest\u002Fresources\u003C\u002Fcode> folder, \nand the \u003Ccode>aws-lambda-java-events\u003C\u002Fcode> type to map the event with.\u003C\u002Fp>\n\u003Cp>We use the JUnit5 \u003Ccode>ParameterizedTest\u003C\u002Fcode> annotation to inject arguments into a test, \nso we can run the same test one or more times with different parameters:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">@ParameterizedTest\n@Event(value = &quot;events\u002Fapigw_request_1.json&quot;, type = APIGatewayProxyRequestEvent.class)\npublic void testEventDeserialization(APIGatewayProxyRequestEvent event) {\n  uuid = UUID.randomUUID().toString();\n  Mockito.when(testUtils.persistTicket(Mockito.any(Ticket.class))).thenReturn(uuid);\n  \n  APIGatewayProxyResponseEvent response = function.handleRequest(event, null);\n  \n  ArgumentCaptor&lt;Ticket&gt; ticketArgumentCaptor = ArgumentCaptor.forClass(Ticket.class);\n  Mockito.verify(testUtils).persistTicket(ticketArgumentCaptor.capture());\n  \n  Assertions.assertEquals(&quot;Lambda rocks&quot;, ticketArgumentCaptor.getValue().getDescription());\n  Assertions.assertEquals(&quot;testuser&quot;, ticketArgumentCaptor.getValue().getUserId());\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>You can find the complete Unit Test code for this example in the GitHub repository \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\">serverless-test-samples\u003C\u002Fa>.\u003C\u002Fp>\n",{"title":6,"order":7,"authors":8,"callout":10,"resources":14},"Unit Testing",8,[9],"Lorenzo Micheli",{"title":11,"description":12,"link":13},"Read the Serverless testing guide","This guide dives deeper into Serverless testing","https:\u002F\u002Fserverlessland.com\u002Ftesting",[15],{"link":16,"text":17,"type":18},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\u002Ftree\u002Fmain\u002Fjava-test-samples","Serverless Java test samples","GitHub","Unit tests validate individual units of your code in isolation, \nhence independently of any other components such as DynamoDb or API Gateway. \n\nTo facilitate unit test of the handler function, move as much of logic as possible to other functions that are then \ncalled by the Lambda handler entry point. \nIn our example, we delegate the persistence of the ticket to the method `ddbUtils.persistTicket(ticket)` of the class `DDBUtils`. \nThe purpose of the `DDBUtils` class is to wrap all the API calls to DynamoDB.\n\n#### Mocking AWS API Calls\n\nIn the production code, we need to create a real DynamoDB client to interact with DynamoDB. \nThe test code instead being performed in isolation, \ndoes not require any interaction with a real database. \nBy mocking an instance of `DDBUtils`, we can simulate the positive and negative scenarios using the client.\n\nTo allow both production and test code execution, we need to define a constructor which takes an instance of `ddbUtils` as argument. \n\n```java\npublic class TicketFunction {\n  private DDBUtils ddbUtils;\n\n  public TicketFunction(DDBUtils ddbUtils) {\n    if (ddbUtils == null) {\n      DynamoDbClient ddb = DDBUtils.getDynamoDbClient();\n      DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()\n        .dynamoDbClient(ddb)\n        .build();\n      this.ddbUtils = new DDBUtils(enhancedClient);\n    } else {\n      this.ddbUtils = ddbUtils;\n    }\n  }\n}\n```\n\nThe test code will create a mocked instance of `DDBUtils` and pass it to the `TicketFunction` constructor; instead \nthe production code will pass null to the TicketFunction constructor so that it created the `DynamoDbClient` and `DynamoDbEnhancedClient`. \nWhen Lambda instantiates the `TestFunction`, it calls the default constructor without any argument, therefore, \nwe need to override the default constructor to invoke the constructor which we just defined passing null as input:\n\n```java\npublic TicketFunction() {\n  this(null);\n}\n```\n\nTo write our unit tests, we will use JUnit, which provides handy assertions and annotations for our tests, and [Mockito](https:\u002F\u002Fsite.mockito.org\u002F), \na popular Java framework that we can use to mock the AWS Services API calls wrapped in the `DDBUtils` class.\n\n```java\npublic class TicketFunctionMockTest {\n\n  @Mock\n  private transient DDBUtils testUtils;\n  \n  private TicketFunction function;\n  \n  @BeforeEach\n  public void beforeEach() {\n    MockitoAnnotations.openMocks(this);\n    function = new TicketFunction(testUtils);\n  }\n}\n```\n\nBefore each test we instantiate a new TicketFunction with the mocked DDBUtils class, so that we can inject a custom \nbehavior in the persistTicket method. For example, the following statement that it will tell the mock to return a \nspecific uuid when the `DDBUtils.persistTicket()` method is called.\n\n```java\nMockito.when(\n  testUtils.persistTicket(\n    Mockito.any(Ticket.class)\n  )\n)\n.thenReturn(uuid);\n```\n\n#### Mocking integrations with other AWS Services\nSo far we have seen how to mock classes we defined to wrap API calls to AWS Services such as DynamoDB, \nbut the behavior of our Lambda function varies depending on the input events received from other AWS Services, \nAPI Gateway in our example.\n\nOur unit tests then can feed custom input events to our Lambda Function and test the behavior in isolation as we are \nmocking any API call to AWS Services. \nIt is the best practice to define these input events as json files stored in the `src\u002Ftest\u002Fresources\u002Fevents` folder.\n\nWe will use the [aws-lambda-java-tests](https:\u002F\u002Fgithub.com\u002Faws\u002Faws-lambda-java-libs\u002Ftree\u002Fmain\u002Faws-lambda-java-tests) library to seamlessly load \nand deserialize JSON events and inject them in your tests.\n\nThe `@Event` annotation provides loaders for the most common event types available in [aws-lambda-java-events](https:\u002F\u002Fgithub.com\u002Faws\u002Faws-lambda-java-libs\u002Ftree\u002Fmain\u002Faws-lambda-java-events). \nIt requires the path of a json file with the event definition from the `src\u002Ftest\u002Fresources` folder, \nand the `aws-lambda-java-events` type to map the event with.\n\nWe use the JUnit5 `ParameterizedTest` annotation to inject arguments into a test, \nso we can run the same test one or more times with different parameters:\n\n```java\n@ParameterizedTest\n@Event(value = \"events\u002Fapigw_request_1.json\", type = APIGatewayProxyRequestEvent.class)\npublic void testEventDeserialization(APIGatewayProxyRequestEvent event) {\n  uuid = UUID.randomUUID().toString();\n  Mockito.when(testUtils.persistTicket(Mockito.any(Ticket.class))).thenReturn(uuid);\n  \n  APIGatewayProxyResponseEvent response = function.handleRequest(event, null);\n  \n  ArgumentCaptor\u003CTicket> ticketArgumentCaptor = ArgumentCaptor.forClass(Ticket.class);\n  Mockito.verify(testUtils).persistTicket(ticketArgumentCaptor.capture());\n  \n  Assertions.assertEquals(\"Lambda rocks\", ticketArgumentCaptor.getValue().getDescription());\n  Assertions.assertEquals(\"testuser\", ticketArgumentCaptor.getValue().getUserId());\n}\n```\n\nYou can find the complete Unit Test code for this example in the GitHub repository [serverless-test-samples](https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples).\n",[21,42,68,197,249,298,314,353,375],{"title":22,"collapsible":23,"isCollapsed":24,"content":25},"Introduction",false,true,[26],{"title":27,"order":28,"authors":29,"callout":31,"prerequisite":35,"time":38,"path":39,"id":40,"link":41},"Getting Started",1,[30],"Dhiraj Mahapatro",{"title":32,"description":33,"link":34},"Watch this video","This Devoxx Belgium 2023 presentation shows effectively running Java on Serverless","https:\u002F\u002Fyoutu.be\u002Fu3tgOE8qFjI?t=5549",[36,37],"Understanding of Java","Understanding of AWS Lambda","2 min","1-introduction","1-introduction.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002F1-introduction",{"title":43,"collapsible":23,"isCollapsed":24,"content":44},"History",[45,53,60],{"title":46,"order":47,"authors":48,"time":49,"path":50,"id":51,"link":52},"Evolution of Java",3,[30],"1 min","history","history.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fhistory",{"title":54,"order":55,"authors":56,"time":38,"path":57,"id":58,"link":59},"Evolution of Compute",4,[30],"compute","compute.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fcompute",{"title":61,"order":62,"authors":63,"time":38,"path":65,"id":66,"link":67},"Challenges",5,[30,64],"Maximilian Schellhorn","challenge","challenge.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fchallenge",{"title":69,"collapsible":23,"isCollapsed":24,"content":70},"Best Practices",[71,89,99,105,122,139,157,173,187],{"title":72,"order":73,"youtubeVideoID":74,"authors":75,"callout":77,"resources":80,"time":85,"path":86,"id":87,"link":88},"Lambda Snapstart",6,"ZbnAithBNYY",[76,30],"Vipan Kumar",{"title":32,"description":78,"link":79},"This serverless office hours session dives deeper into Lambda SnapStart.","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Y5b8_KToeDY",[81],{"link":82,"text":83,"type":84},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=IIKe2dx9Ag0","Spring IO (Barcelona)","video","8 min","snapstart","snapstart.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fsnapstart",{"title":90,"order":73,"authors":91,"callout":92,"time":49,"path":96,"id":97,"link":98},"Tiered Compilation",[76],{"title":93,"description":94,"link":95},"Read this blog","This AWS blog explains Tiered compilation in details","https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fincreasing-performance-of-java-aws-lambda-functions-using-tiered-compilation\u002F","tiered-compilation","tiered-compilation.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Ftiered-compilation",{"title":100,"order":73,"authors":101,"time":49,"path":102,"id":103,"link":104},"Utilize initialization phase",[30],"init-heavy-lifting","init-heavy-lifting.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Finit-heavy-lifting",{"title":106,"order":73,"authors":107,"youtubeVideoID":109,"resources":110,"time":118,"path":119,"id":120,"link":121},"Using RDS Proxy",[108,30],"Sonali Jena","ZQOqmMn_8jw",[111,115],{"link":112,"text":113,"type":114},"https:\u002F\u002Faws.amazon.com\u002Fgetting-started\u002Fhands-on\u002Fset-up-shared-database-connection-amazon-rds-proxy\u002F","Shared DB connections with RDS Proxy","user guide",{"link":116,"type":114,"text":117},"https:\u002F\u002Fdocs.aws.amazon.com\u002FAmazonRDS\u002Flatest\u002FAuroraUserGuide\u002Frds-proxy.html","RDS Proxy","4 min","rds-proxy","rds-proxy.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Frds-proxy",{"title":123,"order":73,"authors":124,"callout":125,"prerequisite":129,"resources":131,"time":38,"path":136,"id":137,"link":138},"Choice of HTTP Clients",[76,30],{"title":126,"description":127,"link":128},"Read this Blog","This blog explains how AWS CRT HTTP Client offers faster startup time and small memory footprint","https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdeveloper\u002Fannouncing-availability-of-the-aws-crt-http-client-in-the-aws-sdk-for-java-2-x\u002F",[130],"Before moving on to HTTP clients, the first and foremost requirement to improve performance in Lambda functions is to upgrade from AWS SDK Java v1 to AWS SDK Java v2 as soon as possible. Version 2 of the AWS SDK was released in Nov 2018 with a lot of performance upgrades.",[132],{"link":133,"type":134,"text":135},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdeveloper\u002Faws-sdk-for-java-2-x-released\u002F","blog","AWS SDK for Java v2","http-clients","http-clients.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fhttp-clients",{"title":140,"order":73,"authors":141,"youtubeVideoID":142,"resources":143,"time":118,"path":154,"id":155,"link":156},"Hexagonal Architecture",[76],"kRFg6fkVChQ",[144,148,151],{"link":145,"text":146,"type":147},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fprescriptive-guidance\u002Flatest\u002Fhexagonal-architectures\u002Fwelcome.html","Hexagonal architecture","guidance",{"link":149,"text":150,"type":134},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fdeveloping-portable-aws-lambda-functions\u002F","Portable Lambda functions",{"link":152,"type":134,"text":153},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fdeveloping-evolutionary-architecture-with-aws-lambda\u002F","Building evolutionary architecture on AWS Lambda","hexagonal","hexagonal.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fhexagonal",{"title":158,"order":73,"authors":159,"youtubeVideoID":161,"resources":162,"time":38,"path":170,"id":171,"link":172},"Powertools for AWS Lambda",[160],"Lavanya Tangutur","dH2GP6Lydj8",[163,167],{"link":164,"text":165,"type":166},"https:\u002F\u002Fgithub.com\u002Faws-powertools\u002Fpowertools-lambda-java","Powertools for AWS Lambda (Java)","github",{"link":168,"type":134,"text":169},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fopensource\u002Fsimplifying-serverless-best-practices-with-aws-lambda-powertools-java\u002F","Best practices with Powertools","powertools","powertools.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fpowertools",{"title":174,"order":73,"authors":175,"youtubeVideoID":176,"callout":177,"resources":181,"time":49,"path":184,"id":185,"link":186},"Lambda Power tuning ",[160,30],"z8wGSykEauI",{"title":178,"description":179,"link":180},"Watch the video","This video covers a variety of AWS Lambda performance and cost optimization techniques including use of Power tuning.","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=z8wGSykEauI",[182,183],{"link":112,"text":113,"type":114},{"link":116,"type":114,"text":117},"powertuning","powertuning.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fpowertuning",{"title":188,"order":73,"authors":189,"resources":190,"time":38,"path":194,"id":195,"link":196},"Using Graviton2",[30],[191],{"link":192,"text":193,"type":134},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fmigrating-aws-lambda-functions-to-arm-based-aws-graviton2-processors\u002F","Using Arm-based Graviton2 processors","graviton","graviton.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fgraviton",{"title":198,"collapsible":23,"isCollapsed":24,"content":199},"Java frameworks",[200,214,223,239],{"title":201,"order":202,"authors":203,"resources":204,"time":38,"path":211,"id":212,"link":213},"Micronaut",7,[160,30],[205,208],{"link":206,"text":207,"type":18},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-java-frameworks-samples\u002Ftree\u002Fmain","Serverless Java Frameworks",{"link":209,"text":210,"type":18},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-patterns\u002Ftree\u002Fmain\u002Fapigw-lambda-rds-snapstart","Micronaut with RDS","micronaut","micronaut.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fmicronaut",{"title":215,"order":202,"authors":216,"resources":217,"time":38,"path":220,"id":221,"link":222},"Quarkus",[160,30],[218],{"link":206,"text":219,"type":18},"Quarkus sample application","quarkus","quarkus.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fquarkus",{"title":224,"order":202,"authors":225,"resources":226,"time":118,"path":236,"id":237,"link":238},"Spring",[160,64],[227,228,232],{"link":206,"text":219,"type":18},{"link":229,"text":230,"type":231},"https:\u002F\u002Fcatalog.workshops.aws\u002Fjava-on-aws-lambda\u002Fen-US","Java on AWS Lambda","workshop",{"link":233,"text":234,"type":235},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdevops\u002Fdeveloping-with-java-and-spring-boot-using-amazon-codewhisperer\u002F","Build Spring Boot using Amazon CodeWhisperer","Blog","springboot","springboot.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fspringboot",{"title":240,"order":202,"authors":241,"resources":242,"time":38,"path":246,"id":247,"link":248},"GraalVM Native Image",[160,30],[243,245],{"link":206,"text":244,"type":18},"GraalVM sample application",{"link":229,"text":230,"type":231},"graalvm","graalvm.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fgraalvm",{"title":250,"collapsible":23,"isCollapsed":23,"content":251},"Testing a Java application",[252,262,270,280,289],{"title":253,"order":7,"authors":254,"callout":255,"resources":256,"time":258,"path":259,"id":260,"link":261},"Testing Serverless",[9],{"title":11,"description":12,"link":13},[257],{"link":16,"text":17,"type":18},"3 min","testing","testing.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Ftesting",{"title":6,"order":7,"authors":263,"callout":264,"resources":265,"time":118,"path":267,"id":268,"link":269},[9],{"title":11,"description":12,"link":13},[266],{"link":16,"text":17,"type":18},"unit","unit.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Funit",{"title":271,"order":7,"authors":272,"callout":273,"resources":274,"time":276,"path":277,"id":278,"link":279},"Integration Testing",[9,30],{"title":11,"description":12,"link":13},[275],{"link":16,"text":17,"type":18},"5 min","integration","integration.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fintegration",{"title":281,"order":7,"authors":282,"callout":283,"resources":284,"time":258,"path":286,"id":287,"link":288},"Functional Testing",[9,30],{"title":11,"description":12,"link":13},[285],{"link":16,"text":17,"type":18},"functional","functional.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Ffunctional",{"title":290,"order":7,"authors":291,"callout":292,"resources":293,"time":38,"path":295,"id":296,"link":297},"Load Testing",[30],{"title":11,"description":12,"link":13},[294],{"link":16,"text":17,"type":18},"load","load.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fload",{"title":299,"collapsible":23,"isCollapsed":24,"content":300},"Local Development",[301,308],{"title":302,"order":303,"authors":304,"time":49,"path":305,"id":306,"link":307},"IntelliJ",10,[30],"intellij","intellij.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fintellij",{"title":309,"order":303,"authors":310,"time":49,"path":311,"id":312,"link":313},"Visual Studio Code",[30],"vscode","vscode.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fvscode",{"title":315,"collapsible":23,"isCollapsed":24,"content":316},"Infrastructure as Code",[317,324,330,340],{"title":318,"order":319,"authors":320,"time":38,"path":321,"id":322,"link":323},"CloudFormation",9,[108],"cloudformation","cloudformation.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fcloudformation",{"title":325,"order":319,"authors":326,"time":276,"path":327,"id":328,"link":329},"AWS CDK",[108],"cdk","cdk.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fcdk",{"title":331,"order":319,"authors":332,"resources":333,"time":38,"path":337,"id":338,"link":339},"AWS SAM",[108],[334],{"link":335,"text":336,"type":134},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fbuilding-serverless-java-applications-with-the-aws-sam-cli\u002F","Java Serverless AWS SAM CLI","sam","sam.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fsam",{"title":341,"order":319,"authors":342,"resources":343,"time":38,"path":350,"id":351,"link":352},"Terraform",[30],[344,347],{"link":345,"type":18,"text":346},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-patterns\u002Ftree\u002Fmain\u002Fapigw-lambda-snapstart-terraform","Java sample with Terraform",{"link":348,"text":349,"type":114},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fserverless-application-model\u002Flatest\u002Fdeveloperguide\u002Fwhat-is-terraform-support.html","AWS SAM CLI Terraform support","terraform","terraform.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fterraform",{"title":354,"collapsible":23,"isCollapsed":24,"content":355},"Benchmarking",[356],{"title":357,"order":358,"youtubeVideoID":359,"authors":360,"resources":361,"time":49,"path":372,"id":373,"link":374},"Performance Benchmarking",11,"wmEIMWigXGc",[30],[362,364,366,369],{"link":363,"text":230,"type":231},"https:\u002F\u002Fcatalog.workshops.aws\u002Fjava-on-aws-lambda\u002Fen-US\u002F01-migration\u002F02-optimizations\u002Fbenchmark",{"link":206,"text":365,"type":18},"Benchmark: Micronaut, Quarkus, and SpringBoot",{"link":367,"text":368,"type":18},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-graalvm-demo","GraalVM native image on AWS Lambda Benchmarking",{"link":370,"text":371,"type":18},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-kotlin-demo","Benchmark Kotlin on Serverless","benchmark","benchmark.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fbenchmark",{"title":376,"collapsible":23,"isCollapsed":24,"content":377},"Migration",[378],{"title":379,"order":380,"authors":381,"youtubeVideoID":382,"resources":383,"time":49,"path":390,"id":391,"link":392},"Migration Guide",12,[30],"u3tgOE8qFjI",[384,388],{"link":385,"text":386,"type":387},"https:\u002F\u002Fserverlessland.com\u002Fcontent\u002Fservice\u002Flambda\u002Fpaved-path\u002Fjava-replatforming\u002Fintroduction","Java re-platforming guide","Guide",{"link":229,"text":230,"type":389},"Workshop","migration","migration.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fmigration","LIST",[395,396,397,398,399,400],"content\u002Fcontributors\u002Fdhiraj-mahapatro.json","content\u002Fcontributors\u002Fsonali-jena.json","content\u002Fcontributors\u002Flavanya-tangutur.json","content\u002Fcontributors\u002Fvipan-kumar.json","content\u002Fcontributors\u002Florenzo-micheli.json","content\u002Fcontributors\u002Fmaximilian-schellhorn.json","Effectively running Java on Serverless",1792665273262]