Ricardo Umpierrez
Ricardo Umpierrez

Reputation: 768

Grails Model Unity Test

I have a "domain"(model) that want to do an Unity Test to check if works. But when I execute the test I get

java.lang.IllegalArgumentException: Test class can only have one constructor

Thats always happen when trying to initialize a class of some domain(model).

What would be the approach to do correctly the testcase?

class Race {

   static constraints = {    }

   String name
   Date startDate
   String city
   String state
   BigDecimal distance
   BigDecimal cost
   Integer maxRunners = 100000

   BigDecimal inMiles() {
      return 0.6
   }
}

And in the Unity Test Class

import grails.test.mixin.TestFor
import spock.lang.Specification

@TestFor(Race)
class RaceTest extends Specification {

   void testInMiles() {
      when:
         def model = new Race(distance:5.0);

      then:
         0.6 == model.inMiles()
   }
}

Upvotes: 0

Views: 77

Answers (1)

Burt Beckwith
Burt Beckwith

Reputation: 75671

In Grails 2.4.x (which is what I'm assuming you're using) the default test type is a Spock test, and that's what's created by the generate-* scripts. You can still write your own tests in JUnit 3 or 4 style if you prefer. But test classes in Spock (at least using the Grails integration, I'm not sure if it's as strict outside of Grails) have to have names ending in "Spec". That's why you're seeing that error.

Test methods do not have to be void and start with "test" (JUnit 3 style) or be void and have an @Test annotation (JUnit 4 style). The test runner decides if a method is a test method if it's public (either explicitly or if there's no scope modifier) and there's at least one labelled block, e.g. when:, given:, then:, etc. Further, Spock uses some AST magic to allow you to use spaces in method names (you just have to quote the whole name) and have expressive, self-descriptive method names, e.g.

def 'an admin without ROLE_SUPER cannot view records of other admins'() {
   ...
}

Upvotes: 1

Related Questions