I've created a domain class in Grails like this:

class MyObject {
    static hasMany = [tags: String]
    // Have to declare this here, as nullable constraint does not seem to be honoured
    Set tags = new HashSet() 

    static constraints = {
        tags(nullable: false)

Writing unit tests to check the size and content of the MyObject.tags property, I found I had to do the following:

assertLength(x, myObject.tags as Object[])
assertEquals(new HashSet([...]), myObject.tags)

To make the syntax nicer for writing the tests, I implemented the following methods:

void assertEquals(List expected, Set actual) {
    assertEquals(new HashSet(expected), actual)

void assertLength(int expected, Set set) {
    assertLength(expected, set as Object[])

I can now call the assertLength() and assertEquals() methods directly on an instance of Set, e.g. assertLength(x, myObject.tags) assertEquals([...], myObject.tags)

I'm new to Groovy and Grails, so unaware how dangerous method overloading like this is. Is it safe? If so, I'm slightly* surprised that these methods (or similar) aren't already available - please let me know if they are.

* I can see how these methods could also introduce ambiguity if people weren't expecting them. E.g. assertLength(1, set) always passes, no matter what the content of set

Accepted Answer

There don't seem to be any problems with the approach outlined in the question.

Written by Alison
This page was build to provide you fast access to the question and the direct accepted answer.
The content is written by members of the stackoverflow.com community.
It is licensed under cc-wiki