【发布时间】:2015-10-10 10:17:34
【问题描述】:
我正在编写我的第一个 Spock 测试并阅读 mocking interactions 上的文档,但我仍然没有在一些项目上看到“树林中的森林”。
我有一个类MyRealm,它为我的应用程序执行身份验证。它有两个依赖项,AuthService 和 ShiroAdapter。前者我想嘲笑,后者我想保持原样(如果可能的话)。这是因为 AuthService 实际上与 LDAP 建立了后端连接,所以我想模拟它。但是ShiroAdapter 只是定义了几个实用方法,将我的对象转换为 Apache Shiro 安全对象(主体、权限等)。所以它可以不被嘲笑(我认为)。
class MyRealmSpec extends Specification {
MyRealm realm
def setup() {
AuthService authService = Mock(AuthService)
// configure 'authService' mock <-- ?????
ShiroAdapter shiroAdapter = new ShiroAdapter()
realm = new MyRealm(authService: authService,
shiroAdapter: shiroAdapter)
}
def "authenticate throws ShiroException whenever auth fails"() {
when:
realm.authenticate('invalid_username', 'invalid_password')
then:
Throwable throwable = thrown()
ShiroException.isAssignableFrom(throwable)
}
}
我相信我非常接近,但正在努力配置模拟以使其按照我希望的方式进行测试。 Spock 文档(上面链接)似乎只记录了如何验证调用模拟方法的次数。我对这里不感兴趣。
在这里,MyRealm#authenticate(String,String) 在后台调用 AuthService#doAuth(String,String)。因此,我需要我的模拟 AuthService 实例来简单地返回 false(表示身份验证失败)或在发生意外情况时抛出 ServiceFaulException。
有什么想法可以做到这一点吗?
【问题讨论】: