系统: Java 1.7 Grails 2.2
在我的域对象中:
class Timer{
BigDecimal hours
static constraints = {
hours min: 0.5, validator: { h ->
// The hours has to be a number in whole or half hour increments.
System.out.println "h:" + h.toString()
// Twice the number :
def h2 = 2 * h
// Extract h2 fractional portion:
String numberStr = Double.toString(h2);
String fractionalStr = numberStr.substring(numberStr.indexOf('.') + 1);
int fractional = Integer.valueOf(fractionalStr);
System.out.println "fraction:" + fractional
// if the fraction is 0 then "h" is a multiple of 0.5
// ie: h = 1.5 => h2 = 3.0, fractional = 0 return TRUE
// ie: h = 1.1 => h2 = 2.2, fractional = 2 return FALSE
(fractional == 0)
}
}
}
在单元测试中
@Build(Timer)
class TimerTests {
@Before
void setUp() {
// Ensure we can invoke validate() on our domain object.
mockForConstraintsTests(Timer)
}
/**
* Ensure setup creates a valid instance
*/
void testValid() {
Timer t = Timer.build()
assertTrue t.validate()
}
/**
* hours must be a number
*/
void testHours(){
Timer m = Timer.build()
assertTrue m.validate()
t.hours = 1;
assertTrue m.validate()
t.hours = 1.5;
assertTrue m.validate()
t.hours = 1.3;
assertFalse m.validate()
assertEquals 'validator', t.errors['hours']
// Test Min constraint
t.hours = 0;
assertFalse t.validate()
assertEquals 'min', t.errors['hours']
//
// Test non numbers
t = new Timer()
t.hours = "ss"
assertFalse t.validate()
}
}
我收到错误org.codehaus.groovy.runtime.typehandling.GroovyCastException:无法将类'java.lang.String'的对象''转换为类'java.math.BigDecimal'
我想确保无法输入字符串,并且小时字段以整数或半小时为增量。
欢迎任何建议。
由于
答案 0 :(得分:2)
问题如下:
t.hours = "ss"
您正在为String
类型的属性分配BigDecimal
值。
如果您让数据绑定系统执行分配,那么您可以通过直接为属性分配值来利用一系列功能。
以下测试将通过(为简单起见,我将.build()
内容从混合中删除了):
package demo
import grails.test.mixin.*
import org.junit.*
@TestFor(Timer)
class TimerTests {
@Before
void setUp() {
// Ensure we can invoke validate() on our domain object.
mockForConstraintsTests(Timer)
}
void testHours(){
Timer m = new Timer(hours: 1)
assertTrue m.validate()
m.hours = 1.5;
assertTrue m.validate()
m.hours = 1.3;
assertFalse m.validate()
assertEquals 'validator', m.errors['hours']
// Test Min constraint
m.hours = 0;
assertFalse m.validate()
assertEquals 'min', m.errors['hours']
// Test non numbers
m = new Timer(hours: 'ss')
assertFalse m.validate()
}
}
我希望有所帮助。