Since Groovy 4.0.5 we can use a subscript operator that accepts multiple fields on a java.util.Date
and java.util.Calendar
objects. And Groovy 4.0.6 extended this subscript operator to any java.time.TemporalAccessor
instance. Before these Groovy version we could already use the subscript operator, but we could provide only one field we wanted to access. In a previous post we already have seen this. But now we can use multiple fields to get their values with one statement. We simply define the fields we want as arguments to the subscript operator. Under the hood the subscript operator is implemented by a getAt
method that is added as an extension to the Date
, Calendar
and TemporalAccess
classes. The return type is java.util.List
and we can combine this with the multiple assignment support in Groovy. In other languages it is also called destructurizing. With multiple assignments we can assign the values from a java.util.List
directly to variables.
Continue reading →
In a previous blog we learned about setting default JVM options when we run Maven commands. We can also set default Maven options that we want to apply each time we run a Maven command. All options can be defined in the file maven.config
in a .mvn
directory in the root of our project. Each option must be defined on a new line. This directory and file can be added to our source control so that all users that have access to the repository will use the same Maven options.
Continue reading →
If we write specification where we need to use files and directories we can use the @TempDir
annotation on a File
or Path
instance variable. By using this annotation we make sure the file is created in the directory defined by the Java system property java.io.tmpdir
. We could overwrite the temporary root directory using Spock configuration if we want, but the default should be okay for most situations. The @TempDir
annotation can actually be used on any class that has a constructor with a File
or Path
argument. Since Spock 2.2 we can use the FileSystemFixture
class provided by Spock. With this class we have a nice DSL to create directory structures and files in a simple matter. We can use the Groovy extensions to File
and Path
to also immediately create contents for the files. If we want to use the extensions to Path
we must make sure we include org.apache.groovy:groovy-nio
as dependency to our test runtime classpath. The FileSystemFixture
class also has the method copyFromClasspath
that we can use to copy files and their content directory into our newly created directory structure.
Continue reading →
In order to add default JVM options to our Maven mvn
command we can define an environment variable MAVEN_OPTS
. But we can also create a file jvm.config
in the directory .mvn
in our project root directory. On each line we define a Java option we want to apply. We can specify JVM options, but also Java system properties we want to apply each time we run the mvn
command. This directory and file can be added to our source control so that all users that have access to the repository will use the same JVM options.
Continue reading →
A version catalog in Gradle is a central place in our project where we can define dependency references with their version or version rules. We can define a version catalog using an API in our build file, but we can also create an external file where we define our dependencies and version. In our dependencies
section we can refer to the names in the version catalog using a type-safe accessor (if we use Kotlin for writing our build script) with code completion in a supported IDE (IntelliJ IDEA). If we want to share a version catalog between projects we can publish a version catalog to a Maven repository with a groupId
, artifactId
and version
.
Continue reading →
Since Spock 2.1 we have 2 new operators we can use for assertions to check collections: =~
and ==~
. We can use these operators with implementations of the Iterable
interface when we want to check that a given collection has the same elements as an expected collection and we don’t care about the order of the elements. Without the new operators we would have to cast our collections to a Set
first and than use the ==
operator.
Continue reading →
If you are familiar with the layers architectural pattern, it is only a small step to the even nicer hexagonal pattern. Here is an example of how you can do it.
Continue reading →
A Software Bill of Materials (SBOM) is a broad inventory of all components, libraries, and other third-party assets used in a software application.
It’s a detailed list of all the components that go into the software, much like a recipe lists the ingredients needed to prepare a dish.
Continue reading →
We’ll compare some code written with Either with similar code written using Exceptions and see how they are the same and how they differ.
Continue reading →
WireMock is a stub framework that helps you create stubs for outgoing HTTP traffic during your tests.
Most people use WireMock in their test suite during build time of the application.
Spin up the WireMock server, configure some stub rules, run the application tests, and tear everything down.
This is a good way of testing your HTTP clients, using real traffic towards an external server.
Continue reading →