我已经为一些Java类编写了Spock测试。当我试图验证参数中使用的确切对象时,测试失败了。
def "all events are published to subscribers"() {
given:
EventSubscriber subscriber = Mock()
when:
subscriber.shouldRegister() >> true
subscriber.interests() >> new HashSet<Intent>(Arrays.asList(COUNTER, GAUGE))
publisher.subscribe(subscriber)
def event = publisher.newEvent("test", COUNTER)
event.start()
def child = event.newChild("child", GAUGE)
event.finish()
then:
// 2 * subscriber.onCreate(event)
// 1 * subscriber.onStart(event, event.start)
// 1 * subscriber.onEnd(event, event.end)
// 1 * subscriber.onChild(event, child)
2 * subscriber.onCreate(_)
1 * subscriber.onStart(_, _)
1 * subscriber.onEnd(_, _)
1 * subscriber.onChild(_, _)
}
注释掉的行以
Spock:1.3groovy:2.5groovy-test-junit5-2.5.7 JDK:11
交互测试中使用的对象实例应该在givid
部分中定义。
这将是有效的:
def 'all events are published to subscribers'() {
given:
EventSubscriber subscriber = Mock()
subscriber.shouldRegister() >> true
subscriber.interests() >> new HashSet<Intent>(Arrays.asList(COUNTER, GAUGE))
publisher.subscribe(subscriber)
def event = publisher.newEvent('test', COUNTER)
def child = event.newChild('child', GAUGE)
when:
event.start()
event.finish()
then:
2 * subscriber.onCreate(event)
1 * subscriber.onStart(event, event.start)
1 * subscriber.onEnd(event, event.end)
1 * subscriber.onChild(event, child)
}
但是,在测试调用oncreate()
和onchild()
时会出现问题,因为这些调用不在when
部分中,只有onstart()
和onend()
可以匹配。
我没有您的类定义来查看详细信息,但我猜event.start
和event.end
字段是在start()
和finish()
方法中初始化的,然后1*onStart(event,event.start)
和1*onEnd(event,event.end)
test将不匹配,因为调用测试将在event
具有不同的start
和end
值的因此,只有1*onStart(event,_)
和1*onEnd(event,_)
测试才会匹配。
请看这个简单的示例,它与您的情况相似,但不同之处在于事件
实例是在给定
部分中准备的,而不是在when
中修改的,因此它将通过测试:
class InvocationWithArgumentsSpec extends Specification {
void 'Invocation test works with arguments other then String'() {
given:
def subscriber = Mock(Subscriber)
def simplePublisher = new Publisher()
simplePublisher.subscribe(subscriber)
def event = new SimpleEvent(name: 'test')
when:
simplePublisher.fireEvent(event)
then:
1 * subscriber.onEvent(event)
}
}
interface Subscriber {
void onEvent(SimpleEvent event)
}
class Publisher {
Subscriber subscriber
void subscribe(Subscriber subscriber) {
this.subscriber = subscriber
}
void fireEvent(SimpleEvent event) {
subscriber.onEvent(event)
}
}
class SimpleEvent {
String name
}
更新:但是有一个解决办法给你。它不是很好,但它可以工作,并测试正确的事件被传递到订阅服务器方法(我想event
有类似name
)的内容:
def 'all events are published to subscribers'() {
given:
EventSubscriber subscriber = Mock()
subscriber.shouldRegister() >> true
subscriber.interests() >> new HashSet<Intent>(Arrays.asList(COUNTER, GAUGE))
publisher.subscribe(subscriber)
when:
def event = publisher.newEvent('test', COUNTER)
event.start()
event.newChild('child', GAUGE)
event.finish()
then:
1 * subscriber.onCreate({ it.name == 'test' })
1 * subscriber.onCreate({ it.name == 'child' })
1 * subscriber.onStart({ it.name == 'test' }, !null)
1 * subscriber.onEnd({ it.name == 'test' }, !null)
1 * subscriber.onChild({ it.name == 'test' }, { it.name == 'child' })
}
每个人 因此,我有一个SpringBoot应用程序,它带有一个控制器,该控制器有几种方法,将以下POJO作为参数: 对于其中一个控制器endpoint,我想应用额外的验证逻辑,因此在我添加了以下内容: 是我想要应用的约束注释。 我的问题是,只有在中定义的检查成功通过时,才会调用此附加约束。如果为空,约束将被忽略,客户端将收到不完整的验证结果。我错过了什么?
我有一系列复杂的类型级别函数,它们的计算结果如下: 显然,在这种情况下,这个表达式是一个。更一般地说,我们可以说: 有没有办法教GHC推断这一点? 编辑:@chi指出,在某些情况下,GADT可以解决这一问题,但我的特殊情况是: 然后 不能被访问,但是也许GHC应该能够推断出
假设我有一个类模板,
我希望对spring服务的参数使用java bean验证注释。考虑以下服务:
主要内容:选取设置检查约束的字段,在创建表时设置检查约束,在修改表时添加检查约束,删除检查约束MySQL检查约束(CHECK)是用来检查数据表中字段值有效性的一种手段,可以通过 CREATE TABLE 或 ALTER TABLE 语句实现。设置检查约束时要根据实际情况进行设置,这样能够减少无效数据的输入。 在《MySQL默认值》和《MySQL非空约束》中讲解的默认值约束和非空约束也可看作是特殊的检查约束。 选取设置检查约束的字段 检查约束使用 CHECK 关键字,具体的语法格式如下: C
主要内容:Oracle Check约束简介在本教程中,您将学习如何使用Oracle检查约束来强制域(列)的完整性。 Oracle Check约束简介 Oracle检查约束允许通过限制一列或多列所接受的值来强制执行域完整性。 要创建一个检查约束,可以定义一个返回或的逻辑表达式。 Oracle使用此表达式来验证正在插入或更新的数据。 如果表达式的计算结果为,则Oracle接受数据并进行插入或更新。 否则,Oracle将拒绝这些数据,新数据根本