Я пишу свой первый тест Spock и читаю документы по адресу mocking interactions, но я до сих пор не вижу «лес через деревья» на нескольких элементах.Определение Spock mock behaviors
У меня есть класс, MyRealm
, который выполняет аутентификацию для моего приложения. Он имеет две зависимости: AuthService
и ShiroAdapter
. Первое, что я хотел бы высмеять, и последнее, что я хочу оставить как есть (если вообще возможно). Это связано с тем, что AuthService
фактически делает подключение к LDAP с бэкэнд, поэтому я хочу издеваться над ним. Но ShiroAdapter
просто определяет несколько методов утилиты, которые преобразуют мои объекты в объекты безопасности Apache Shiro (принципы, разрешения и т. Д.). Таким образом, его можно оставить без посмеивания (methinks).
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 (связанный выше) только, кажется, документируют, как проверять количество раз вызывается метод mock. Меня это не интересует.
Здесь MyRealm#authenticate(String,String)
звонки AuthService#doAuth(String,String)
под капотом. Поэтому мне нужен мой макет AuthService
экземпляр, чтобы просто вернуть false
(с указанием отказавшего auth) или выбросить ServiceFaulException
, если что-то произошло неожиданно.
Любые идеи, как я могу это сделать?
Thanks @Durandal (+1) - как я могу достичь логики «* OR *» на этикетке 'then'? Как я могу изменить вещи для достижения логики «* И *» там? Еще раз спасибо! – smeeb
И неявна в предложениях 'then', каждый притворный вызов или условный список проверяется в указанном порядке; Я просто помещал туда ИЛИ, чтобы показать пример возврата исключения и возврата логического. Вы можете добавить предложение 'where', чтобы выполнить оба теста. Я обновлю, чтобы добавить этот случай. – Durandal