{"id":6482,"date":"2017-02-07T14:22:25","date_gmt":"2017-02-07T13:22:25","guid":{"rendered":"http:\/\/consulting.stylemixthemes.com\/?p=738"},"modified":"2022-10-09T09:13:48","modified_gmt":"2022-10-09T08:13:48","slug":"writing-integration-tests-spring-boot-cassandra-2-minutes","status":"publish","type":"post","link":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/","title":{"rendered":"Writing integration tests with Spring Boot and Cassandra in 2 minutes"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"6482\" class=\"elementor elementor-6482\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-23d1d75 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"23d1d75\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9d879f8\" data-id=\"9d879f8\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-23d3379 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"23d3379\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-16 elementor-top-column elementor-element elementor-element-23d3b6c elementor-hidden-tablet elementor-hidden-phone\" data-id=\"23d3b6c\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap\">\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-23d4248\" data-id=\"23d4248\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-23d48fd elementor-widget elementor-widget-text-editor\" data-id=\"23d48fd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Recently, a client asked us to develop a mobile application served by a REST backend with a lot of data to be stored. To make a long story short, we ended up using Cassandra to answer those requirements. Following an Agile approach to development, we also used TDD, Test-Driven Development.<\/p>\n<p>As we started development from scratch, it seemed natural to develop automated integration tests against the application database. Usually, this is easily done when using relational databases, e.g. testing against a in-memory database like H2, but we realized that such ability does not come out of the box with Spring Boot and Cassandra, at least in its community edition.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-134a3c6 elementor-widget elementor-widget-stm_testimonials\" data-id=\"134a3c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"stm_testimonials.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\n\n            <div class=\"stm_testimonials consulting_elementor_testimonials style_1\">\n                            <div class=\"item\">\n                    <div class=\"testimonial\"><p>To be an Arexo employee is also to be an actor of the evolution of the company, its mindset and its values. As I often say, pleasure in the job gives perfection in the work!<\/p>\n<\/div>\n                    <div class=\"testimonial-info clearfix\">\n                        <div class=\"testimonial-image\"><\/div>\n                        <div class=\"testimonial-text\">\n                            <div class=\"name\">Thibault<\/div>\n                            <div class=\"company\">\n                            Software Engineer, Arexo                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n                    <\/div>\n    \n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-9596903 elementor-widget elementor-widget-text-editor\" data-id=\"9596903\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>So we had to find a solution to start a Cassandra server inside just before the execution of our tests, and also to be able to inject some data for test purposes.<\/p>\n<h2 id=\"introduction\">Introduction<\/h2>\n<p>The following document describes the solution we came up with, making use of the \u00a0cassandra-unit framework. We also describe how to configure your project accordingly, based on:<\/p>\n<ul>\n<li>Spring Boot 1.3.5<\/li>\n<li>Cassandra-unit 2.2.2.1<\/li>\n<li>Cassandra driver 2.1.7.1<\/li>\n<\/ul>\n<p><em>NB : For demonstration purpose, I wrote a basic log management application. It mainly focuses on providing a test and validating what is retrieved from the database. You can find the source code from our Github pro_ject available here https:\/\/github.com\/Arexo\/cassandra-unit-spring-demo<\/em><\/p>\n<h2 id=\"goals-of-integration-test\">Goals of integration test<\/h2>\n<p>An integration test is the component software in which individual software modules are combined and tested as a group. It occurs after unit testing and before validation testing. In this example we will combine the REST server backend module and the database together.<\/p>\n<p>During this how-to, you will go through the following steps :<\/p>\n<ol>\n<li>Configure your project to use SpringBoot and Cassandra-unit<\/li>\n<li>Writing a dataset to inject data into the cassandra database during the test<\/li>\n<li>Configure_application.properties_ to use cassandra<\/li>\n<li>Writing the test itself<\/li>\n<li>Execute the test<\/li>\n<\/ol>\n<h2 id=\"a-word-on-cassandra-unit\">A word on Cassandra-unit<\/h2>\n<p>Cassandra-unit, as indicated by its name, is a unit testing library which adds to your test the ability to start\/stop a Cassandra database server and also inject a CQL dataset into it.<\/p>\n<p>The project provides two modules:<\/p>\n<ul>\n<li>cassandra-unit : the core, contains everything to start the server, injection of dataset, etc\u2026<\/li>\n<li>cassandra-unit-spring : A library which fills the gap between Spring-Boot dependency injection and the Cassandra related stuff. The second ones include the first.<\/li>\n<\/ul>\n<p>More info on the project <a href=\"https:\/\/github.com\/jsevellec\/cassandra-unit\">GitHub\u2019s page<\/a><\/p>\n<div class=\"entry-content rte\">\n<h2 id=\"lets-go\">Let\u2019s go!!!<\/h2>\n<h3 id=\"configure-your-project\">Configure your project<\/h3>\n<p>For this example, I used Gradle as build management system. Add the following dependencies to your build.gradle file.<\/p>\n<pre><code class=\"handlebars hljs javascript\">ext {\n   springBootVersion = <span class=\"hljs-string\">'1.3.5.RELEASE'<\/span>\n}\n\ndependencies {\n    compile(<span class=\"hljs-string\">\"org.springframework.boot:spring-boot-starter-web:${springBootVersion}\"<\/span>)\n    compile(<span class=\"hljs-string\">\"org.springframework.boot:spring-boot-starter-data-cassandra:${springBootVersion}\"<\/span>)\n    compile(<span class=\"hljs-string\">\"com.datastax.cassandra:cassandra-driver-core:2.1.7.1\"<\/span>)\n    compile(<span class=\"hljs-string\">\"com.datastax.cassandra:cassandra-driver-dse:2.1.7.1\"<\/span>)\n    testCompile(<span class=\"hljs-string\">\"org.springframework.boot:spring-boot-starter-test:${springBootVersion}\"<\/span>)\n    testCompile(<span class=\"hljs-string\">'org.cassandraunit:cassandra-unit-spring:2.2.2.1'<\/span>)\n}\n<\/code><\/pre>\n<h3 id=\"write-a-dataset\">Write a dataset<\/h3>\n<p>Create a dataset file, the CQL instructions present in that file will be played against the database which is loaded within your test.<\/p>\n<p>The \u201cdataset.cql\u201d file:<\/p>\n<pre><code class=\"handlebars hljs javascript\">CREATE KEYSPACE IF NOT EXISTS mykeyspace WITH replication = {<span class=\"hljs-string\">'class'<\/span>: <span class=\"hljs-string\">'SimpleStrategy'<\/span>, <span class=\"hljs-string\">'replication_factor'<\/span>: <span class=\"hljs-string\">'1'<\/span>}  AND durable_writes = <span class=\"hljs-literal\">true<\/span>;\n\nDROP TABLE IF EXISTS mykeyspace.logs;\n\nCREATE TABLE IF NOT EXISTS mykeyspace.logs (\n    id text,\n    query text,\n    PRIMARY KEY (id)\n);\n\nINSERT into mykeyspace.logs(id, query) values (<span class=\"hljs-string\">'1'<\/span>,<span class=\"hljs-string\">'cinema'<\/span>);\n<\/code><\/pre>\n<h3 id=\"add-cassandra-properties-to-applicationproperies\">Add cassandra properties to application.properies<\/h3>\n<p><code class=\"handlebars hljs\">test.url=http:\/\/localhost<\/code><\/p>\n<p>spring.data.cassandra.keyspace-name=mykeyspace<\/p>\n<p>spring.data.cassandra.contact-points=localhost<\/p>\n<p>spring.data.cassandra.port=9142<\/p>\n<p>There is nothing magic here, just tell the Spring Boot Cassandra auto-configuration to connect on localhost and port 9142.<\/p>\n<p>Warning! Cassandra-unit, by default, \u00a0starts Cassandra on port 9142 instead of 9042.<\/p>\n<h3 id=\"write-a-test\">Write a test<\/h3>\n<pre><code class=\"handlebars hljs javascript\">package be.arexo.demos.cassandra.controller;\n\n<span class=\"hljs-keyword\">import<\/span> be.arexo.demos.cassandra.DemoApplication;\n<span class=\"hljs-keyword\">import<\/span> be.arexo.demos.cassandra.test.AbstractEmbeddedCassandraTest;\n<span class=\"hljs-keyword\">import<\/span> org.cassandraunit.spring.CassandraDataSet;\n<span class=\"hljs-keyword\">import<\/span> org.junit.Test;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.http.HttpStatus;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.http.ResponseEntity;\n\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-keyword\">static<\/span> org.hamcrest.core.Is.is;\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-keyword\">static<\/span> org.junit.Assert.assertEquals;\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-keyword\">static<\/span> org.junit.Assert.assertThat;\n\n\n@SpringApplicationConfiguration(classes = DemoApplication.class)\n@CassandraDataSet(keyspace = <span class=\"hljs-string\">\"mykeyspace\"<\/span>, value = {<span class=\"hljs-string\">\"dataset.cql\"<\/span>})\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">LogControllerTest<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">AbstractEmbeddedCassandraTest<\/span> <\/span>{\n\n    @Test\n    public <span class=\"hljs-keyword\">void<\/span> testFindOne() throws Exception {\n\n        ResponseEntity response = client.getForEntity(<span class=\"hljs-string\">\"\/logs\/{id}\"<\/span>, Log.class, <span class=\"hljs-number\">1<\/span>);\n\n        assertThat(response.getStatusCode()     , is(HttpStatus.OK));\n        assertThat(response.getBody().getQuery(), is(<span class=\"hljs-string\">\"cinema\"<\/span>));\n    }\n}\n<\/code><\/pre>\n<p>The annotation @CassandraDataSet is used to define the keyspace to use and also the cql requests to load into the database.<\/p>\n<h3 id=\"go-further-and-create-an-abstract-test-class\">Go further and create an abstract test class<\/h3>\n<pre><code class=\"handlebars hljs javascript\">package be.arexo.demos.cassandra.test;\n\n<span class=\"hljs-keyword\">import<\/span> org.cassandraunit.spring.CassandraUnitDependencyInjectionTestExecutionListener;\n<span class=\"hljs-keyword\">import<\/span> org.cassandraunit.spring.EmbeddedCassandra;\n<span class=\"hljs-keyword\">import<\/span> org.junit.runner.RunWith;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.beans.factory.annotation.Value;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.boot.test.SpringApplicationConfiguration;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.boot.test.TestRestTemplate;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.boot.test.WebIntegrationTest;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.test.context.TestExecutionListeners;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.test.context.junit4.SpringJUnit4ClassRunner;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.test.context.support.DependencyInjectionTestExecutionListener;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.client.RestTemplate;\n<span class=\"hljs-keyword\">import<\/span> org.springframework.web.util.DefaultUriTemplateHandler;\n\n<span class=\"hljs-keyword\">import<\/span> javax.annotation.PostConstruct;\n\n@RunWith(SpringJUnit4ClassRunner.class)\n@WebIntegrationTest(randomPort = <span class=\"hljs-literal\">true<\/span>) <span class=\"hljs-comment\">\/\/ Pick a random port for Tomcat<\/span>\n@TestExecutionListeners(listeners = {\n        CassandraUnitDependencyInjectionTestExecutionListener.class,\n        DependencyInjectionTestExecutionListener.class}\n)\n@EmbeddedCassandra(timeout = <span class=\"hljs-number\">60000<\/span>)\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">AbstractEmbeddedCassandraTest<\/span> <\/span>{\n\n    @Value(<span class=\"hljs-string\">\"${local.server.port}\"<\/span>)\n    protected int port;\n\n    @Value(<span class=\"hljs-string\">\"${test.url}\"<\/span>)\n    protected <span class=\"hljs-built_in\">String<\/span> url;\n\n    protected RestTemplate client;\n\n    @PostConstruct\n    public <span class=\"hljs-keyword\">void<\/span> init() {\n        DefaultUriTemplateHandler handler = <span class=\"hljs-keyword\">new<\/span> DefaultUriTemplateHandler();\n        handler.setBaseUrl(url + <span class=\"hljs-string\">\":\"<\/span> + port);\n        handler.setParsePath(<span class=\"hljs-literal\">true<\/span>);\n\n        client = <span class=\"hljs-keyword\">new<\/span> TestRestTemplate();\n        client.setUriTemplateHandler(handler);\n    }\n}\n<\/code><\/pre>\n<h3 id=\"execute-the-test\">Execute the test<\/h3>\n<p>Then execute it and you should see something like this as output:<\/p>\n<p><samp><br \/>016-10-19 21:21:28.415 INFO 40099 \u2014 [ main] b.a.d.c.controller.LogControllerTest : Started LogControllerTest in 3.461 seconds (JVM running for 14.008)<br \/>2016-10-19 21:21:28.627 INFO 40099 \u2014 [o-auto-1-exec-1] o.a.c.c.C.[Tomcat].[localhost].[\/] : Initializing Spring FrameworkServlet \u2018dispatcherServlet\u2019<br \/>2016-10-19 21:21:28.628 INFO 40099 \u2014 [o-auto-1-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet \u2018dispatcherServlet\u2019: initialization started<br \/>2016-10-19 21:21:28.641 INFO 40099 \u2014 [o-auto-1-exec-1] o.s.web.servlet.DispatcherServlet : FrameworkServlet \u2018dispatcherServlet\u2019: initialization completed in 13 ms<br \/>2016-10-19 21:21:28.854 INFO 40099 \u2014 [ main] c.d.d.c.p.DCAwareRoundRobinPolicy : Using data-center name \u2018datacenter1\u2032 for DCAwareRoundRobinPolicy (if this is incorrect, please provide the correct datacenter name with DCAwareRoundRobinPolicy constructor)<br \/>2016-10-19 21:21:28.854 INFO 40099 \u2014 [ main] com.datastax.driver.core.Cluster : New Cassandra host localhost\/127.0.0.1:9142 added<br \/>2016-10-19 21:21:28.889 INFO 40099 \u2014 [edPool-Worker-2] o.a.cassandra.service.MigrationManager : Drop Keyspace \u2018system_distributed\u2019<br \/>2016-10-19 21:21:29.196 INFO 40099 \u2014 [edPool-Worker-3] o.a.cassandra.service.MigrationManager : Drop Keyspace \u2018mykeyspace\u2019<br \/>2016-10-19 21:21:29.489 INFO 40099 \u2014 [iceShutdownHook] o.apache.cassandra.thrift.ThriftServer : Stop listening to thrift clients<br \/>2016-10-19 21:21:29.489 INFO 40099 \u2014 [ Thread-3] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@4372b9b6: startup date [Wed Oct 19 21:21:25 CEST 2016]; root of context hierarchy<br \/>2016-10-19 21:21:29.498 INFO 40099 \u2014 [iceShutdownHook] org.apache.cassandra.transport.Server : Stop listening for CQL clients<br \/>2016-10-19 21:21:29.498 INFO 40099 \u2014 [iceShutdownHook] org.apache.cassandra.gms.Gossiper : Announcing shutdown<br \/>2016-10-19 21:21:29.499 INFO 40099 \u2014 [iceShutdownHook] o.a.cassandra.service.StorageService : Node \/127.0.0.1 state jump to normal<br \/>2016-10-19 21:21:29.506 ERROR 40099 \u2014 [-reconnection-0] c.d.driver.core.ControlConnection : [Control connection] Cannot connect to any host, scheduling retry in 1000 milliseconds<br \/>2016-10-19 21:21:30.509 ERROR 40099 \u2014 [-reconnection-0] c.d.driver.core.ControlConnection : [Control connection] Cannot connect to any host, scheduling retry in 2000 milliseconds<br \/>2016-10-19 21:21:31.502 INFO 40099 \u2014 [iceShutdownHook] o.apache.cassandra.net.MessagingService : Waiting for messaging service to quiesce<br \/>2016-10-19 21:21:31.503 INFO 40099 \u2014 [CEPT-\/127.0.0.1] o.apache.cassandra.net.MessagingService : MessagingService has terminated the accept() thread<br \/><\/samp><\/p>\n<h2 id=\"conclusion\">Conclusion<\/h2>\n<p>That \u2018s all, as you can see, writing integration test with an embedded cassandra database is not so difficult. With this code, you have and example and you\u2019re ready to go\u2026<\/p>\n<p>I hope you enjoyed this article. If you have any remarks, please feel free to contact me at olivier.antoine@arexo.be <img decoding=\"async\" class=\"wp-smiley\" src=\"https:\/\/www.arexo.be\/wp-includes\/images\/smilies\/icon_smile.gif\" alt=\":-)\" \/><\/p>\n<h2 id=\"troubleshooting\">Troubleshooting<\/h2>\n<p>If you get this \u2026<\/p>\n<p><samp><br \/>java.lang.NoSuchMethodError: com.codahale.metrics.Snapshot: method ()V not found<br \/>at com.codahale.metrics.UniformSnapshot.(UniformSnapshot.java:39) ~[metrics-core-3.1.0.jar:3.0.2]<br \/>at org.apache.cassandra.metrics.EstimatedHistogramReservoir$HistogramSnapshot.(EstimatedHistogramReservoir.java:77) ~[cassandra-all-2.2.2.jar:2.2.2]<br \/>at org.apache.cassandra.metrics.EstimatedHistogramReservoir.getSnapshot(EstimatedHistogramReservoir.java:62) ~[cassandra-all-2.2.2.jar:2.2.2]<br \/>at com.codahale.metrics.Histogram.getSnapshot(Histogram.java:54) ~[metrics-core-3.0.2.jar:3.0.2]<br \/>at com.codahale.metrics.Timer.getSnapshot(Timer.java:142) ~[metrics-core-3.0.2.jar:3.0.2]<br \/>at org.apache.cassandra.db.ColumnFamilyStore$3.run(ColumnFamilyStore.java:435) ~[cassandra-all-2.2.2.jar:2.2.2]<br \/>\u2026<br \/>at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_25]<br \/>at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_25]<br \/>at java.lang.Thread.run(Thread.java:745) [na:1.8.0_25]<br \/><\/samp><\/p>\n<p>Exclude the package <em>com.codahale.metrics<\/em> from the dependency configuration:<\/p>\n<pre><code class=\"handlebars hljs javascript\">configurations {\n    all*.exclude group: <span class=\"hljs-string\">'com.codahale.metrics'<\/span>\n}<br \/><\/code><\/pre>\n<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-23d671b elementor-widget elementor-widget-stm_spacing\" data-id=\"23d671b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"stm_spacing.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"stm-spacing\" id=\"stm-spacing-6a1b0949868ae\"><\/div>\n<script>\n    (function($){\n        \"use strict\";\n        var spacingID = 'stm-spacing-6a1b0949868ae',\n            lgSpacing = '80',\n            mdSpacing = '80',\n            smSpacing = '30',\n            xsSpacing = '20';\n\n        function stmSpacing() {\n            if ( window.matchMedia(\"(min-width: 1200px)\").matches && lgSpacing ) {\n                $( '#' + spacingID ).css ( \"height\", lgSpacing );\n            } else if ( window.matchMedia(\"(max-width: 1199px) and (min-width: 992px )\").matches && mdSpacing ) {\n                $( '#' + spacingID ).css ( \"height\", mdSpacing );\n            } else if ( window.matchMedia(\"(max-width: 991px) and (min-width: 768px )\").matches && smSpacing ) {\n                $( '#' + spacingID ).css ( \"height\", smSpacing );\n            } else if ( window.matchMedia(\"(max-width: 767px)\").matches && xsSpacing ) {\n                $( '#' + spacingID ).css ( \"height\", xsSpacing );\n            } else {\n                $( '#' + spacingID ).css ( \"height\", \"\" );\n            }\n        }\n\n        $(document).ready(function() {\n            stmSpacing();\n        });\n\n        $(window).resize(function() {\n            stmSpacing();\n        });\n\n    })(jQuery);\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t<div class=\"elementor-column elementor-col-16 elementor-top-column elementor-element elementor-element-23d67e2 elementor-hidden-tablet elementor-hidden-phone\" data-id=\"23d67e2\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-23d6e57 elementor-widget elementor-widget-stm_share_buttons\" data-id=\"23d6e57\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"stm_share_buttons.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"stm_share_buttons   consulting_elementor_share_buttons\">\n    <\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Recently, a client asked us to develop a mobile application served by a REST backend with a lot of data to be stored. To make a long story short, we ended up using Cassandra to answer those requirements. Following an Agile approach to development, we also used TDD, Test-Driven Development.<\/p>\n","protected":false},"author":1,"featured_media":8966,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-6482","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Writing integration tests with Spring Boot and Cassandra in 2 minutes - Arexo<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Writing integration tests with Spring Boot and Cassandra in 2 minutes - Arexo\" \/>\n<meta property=\"og:description\" content=\"Recently, a client asked us to develop a mobile application served by a REST backend with a lot of data to be stored. To make a long story short, we ended up using Cassandra to answer those requirements. Following an Agile approach to development, we also used TDD, Test-Driven Development.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/\" \/>\n<meta property=\"og:site_name\" content=\"Arexo\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-07T13:22:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-10-09T08:13:48+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/arexo.be\/wp-content\/uploads\/2017\/02\/1200px-Cassandra_logo.svg.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"804\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"stephane.rondal@arexo.be\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@arexoconsulting\" \/>\n<meta name=\"twitter:site\" content=\"@arexoconsulting\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"stephane.rondal@arexo.be\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/\"},\"author\":{\"name\":\"stephane.rondal@arexo.be\",\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/#\\\/schema\\\/person\\\/c5e7a1da77112acb9a9ebc09e112a33c\"},\"headline\":\"Writing integration tests with Spring Boot and Cassandra in 2 minutes\",\"datePublished\":\"2017-02-07T13:22:25+00:00\",\"dateModified\":\"2022-10-09T08:13:48+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/\"},\"wordCount\":1058,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/arexo.be\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/1200px-Cassandra_logo.svg.png\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/\",\"url\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/\",\"name\":\"Writing integration tests with Spring Boot and Cassandra in 2 minutes - Arexo\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/arexo.be\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/1200px-Cassandra_logo.svg.png\",\"datePublished\":\"2017-02-07T13:22:25+00:00\",\"dateModified\":\"2022-10-09T08:13:48+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/#primaryimage\",\"url\":\"https:\\\/\\\/arexo.be\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/1200px-Cassandra_logo.svg.png\",\"contentUrl\":\"https:\\\/\\\/arexo.be\\\/wp-content\\\/uploads\\\/2017\\\/02\\\/1200px-Cassandra_logo.svg.png\",\"width\":1200,\"height\":804},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/writing-integration-tests-spring-boot-cassandra-2-minutes\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/arexo.be\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Writing integration tests with Spring Boot and Cassandra in 2 minutes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/arexo.be\\\/en\\\/\",\"name\":\"Arexo\",\"description\":\"An Agile IT Company\",\"publisher\":{\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/arexo.be\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/#organization\",\"name\":\"Arexo\",\"url\":\"https:\\\/\\\/arexo.be\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/arexo.be\\\/wp-content\\\/uploads\\\/2022\\\/10\\\/AREXO-logo-baseline_color-pos.png\",\"contentUrl\":\"https:\\\/\\\/arexo.be\\\/wp-content\\\/uploads\\\/2022\\\/10\\\/AREXO-logo-baseline_color-pos.png\",\"width\":2203,\"height\":1116,\"caption\":\"Arexo\"},\"image\":{\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/x.com\\\/arexoconsulting\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/arexo-consulting\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/arexo.be\\\/en\\\/#\\\/schema\\\/person\\\/c5e7a1da77112acb9a9ebc09e112a33c\",\"name\":\"stephane.rondal@arexo.be\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0d9921781c43524f9ff77da8f9f7109f16f176ccebbaa5c1e5fb57644184e839?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0d9921781c43524f9ff77da8f9f7109f16f176ccebbaa5c1e5fb57644184e839?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/0d9921781c43524f9ff77da8f9f7109f16f176ccebbaa5c1e5fb57644184e839?s=96&d=mm&r=g\",\"caption\":\"stephane.rondal@arexo.be\"},\"sameAs\":[\"https:\\\/\\\/arexo.be\"],\"url\":\"https:\\\/\\\/arexo.be\\\/en\\\/author\\\/stephane-rondalarexo-be\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Writing integration tests with Spring Boot and Cassandra in 2 minutes - Arexo","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/","og_locale":"en_US","og_type":"article","og_title":"Writing integration tests with Spring Boot and Cassandra in 2 minutes - Arexo","og_description":"Recently, a client asked us to develop a mobile application served by a REST backend with a lot of data to be stored. To make a long story short, we ended up using Cassandra to answer those requirements. Following an Agile approach to development, we also used TDD, Test-Driven Development.","og_url":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/","og_site_name":"Arexo","article_published_time":"2017-02-07T13:22:25+00:00","article_modified_time":"2022-10-09T08:13:48+00:00","og_image":[{"width":1200,"height":804,"url":"https:\/\/arexo.be\/wp-content\/uploads\/2017\/02\/1200px-Cassandra_logo.svg.png","type":"image\/png"}],"author":"stephane.rondal@arexo.be","twitter_card":"summary_large_image","twitter_creator":"@arexoconsulting","twitter_site":"@arexoconsulting","twitter_misc":{"Written by":"stephane.rondal@arexo.be","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/#article","isPartOf":{"@id":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/"},"author":{"name":"stephane.rondal@arexo.be","@id":"https:\/\/arexo.be\/en\/#\/schema\/person\/c5e7a1da77112acb9a9ebc09e112a33c"},"headline":"Writing integration tests with Spring Boot and Cassandra in 2 minutes","datePublished":"2017-02-07T13:22:25+00:00","dateModified":"2022-10-09T08:13:48+00:00","mainEntityOfPage":{"@id":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/"},"wordCount":1058,"commentCount":0,"publisher":{"@id":"https:\/\/arexo.be\/en\/#organization"},"image":{"@id":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/#primaryimage"},"thumbnailUrl":"https:\/\/arexo.be\/wp-content\/uploads\/2017\/02\/1200px-Cassandra_logo.svg.png","inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/","url":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/","name":"Writing integration tests with Spring Boot and Cassandra in 2 minutes - Arexo","isPartOf":{"@id":"https:\/\/arexo.be\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/#primaryimage"},"image":{"@id":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/#primaryimage"},"thumbnailUrl":"https:\/\/arexo.be\/wp-content\/uploads\/2017\/02\/1200px-Cassandra_logo.svg.png","datePublished":"2017-02-07T13:22:25+00:00","dateModified":"2022-10-09T08:13:48+00:00","breadcrumb":{"@id":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/#primaryimage","url":"https:\/\/arexo.be\/wp-content\/uploads\/2017\/02\/1200px-Cassandra_logo.svg.png","contentUrl":"https:\/\/arexo.be\/wp-content\/uploads\/2017\/02\/1200px-Cassandra_logo.svg.png","width":1200,"height":804},{"@type":"BreadcrumbList","@id":"https:\/\/arexo.be\/en\/writing-integration-tests-spring-boot-cassandra-2-minutes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/arexo.be\/en\/"},{"@type":"ListItem","position":2,"name":"Writing integration tests with Spring Boot and Cassandra in 2 minutes"}]},{"@type":"WebSite","@id":"https:\/\/arexo.be\/en\/#website","url":"https:\/\/arexo.be\/en\/","name":"Arexo","description":"An Agile IT Company","publisher":{"@id":"https:\/\/arexo.be\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/arexo.be\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/arexo.be\/en\/#organization","name":"Arexo","url":"https:\/\/arexo.be\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/arexo.be\/en\/#\/schema\/logo\/image\/","url":"https:\/\/arexo.be\/wp-content\/uploads\/2022\/10\/AREXO-logo-baseline_color-pos.png","contentUrl":"https:\/\/arexo.be\/wp-content\/uploads\/2022\/10\/AREXO-logo-baseline_color-pos.png","width":2203,"height":1116,"caption":"Arexo"},"image":{"@id":"https:\/\/arexo.be\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/arexoconsulting","https:\/\/www.linkedin.com\/company\/arexo-consulting\/"]},{"@type":"Person","@id":"https:\/\/arexo.be\/en\/#\/schema\/person\/c5e7a1da77112acb9a9ebc09e112a33c","name":"stephane.rondal@arexo.be","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/0d9921781c43524f9ff77da8f9f7109f16f176ccebbaa5c1e5fb57644184e839?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/0d9921781c43524f9ff77da8f9f7109f16f176ccebbaa5c1e5fb57644184e839?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/0d9921781c43524f9ff77da8f9f7109f16f176ccebbaa5c1e5fb57644184e839?s=96&d=mm&r=g","caption":"stephane.rondal@arexo.be"},"sameAs":["https:\/\/arexo.be"],"url":"https:\/\/arexo.be\/en\/author\/stephane-rondalarexo-be\/"}]}},"_links":{"self":[{"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/posts\/6482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/comments?post=6482"}],"version-history":[{"count":29,"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/posts\/6482\/revisions"}],"predecessor-version":[{"id":8968,"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/posts\/6482\/revisions\/8968"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/media\/8966"}],"wp:attachment":[{"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/media?parent=6482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/categories?post=6482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arexo.be\/en\/wp-json\/wp\/v2\/tags?post=6482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}