Groovy издевается с и без замыкания: поведение кажется странным - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть два класса, которые я тестирую.У них обеих есть две функции (outer и inner).

Я хочу посмотреть, какие параметры были переданы inner.Итак, я высмеиваю inner, используя MockFor (mock.demand.inner) с другим Closure.

Первый класс возвращает Closure, который вызовет inner.Затем Closure выполняется тестом.Работает, оригинал inner не вызывается.

Второй класс выполняет inner напрямую.Не получается, вызывается оригинал inner.

Я пытался смоделировать его, переопределяя его ( Может ли Groovy динамически добавлять или переопределять метод в POJO? ) и оригиналinner все еще называется.

Дело в том, что я должен позвонить inner изнутри outer со вторым классом.Я не могу отложить или делегировать это.

Итак, мне интересно, что там происходит?Как я могу заставить его работать?

Вот код, урезанный от 1500+ строк до 66 строк, выделяющий и выделяющий фактическое поведение.

Чтобы узнать, является ли innerне правильно издевается, это исключение.Это будет брошено, только если это не издевается.

package org.aroundmedia.tools

import groovy.mock.interceptor.MockFor
import org.junit.Test
import sun.reflect.generics.reflectiveObjects.NotImplementedException

class ClassWithClosure {
    def outer() {
        return { this.inner('foo') }
    }

    private def inner(arg) {
        throw new NotImplementedException()
    }
}
class ClassWithoutClosure {
    def outer() {
        this.inner('foo')
    }

    private def inner(arg) {
        throw new NotImplementedException()
    }
}

class ParameterizedTestsForPostAlways extends GroovyTestCase {
    @Test
    void testWithClosure() {
        def mock = new MockFor(ClassWithClosure)
        mock.ignore('outer')
        def res = []
        mock.demand.inner {a -> res.add(a)}

        mock.use {
            def instance = new ClassWithClosure()

            def closure = instance.outer()
            closure()
        }
        assert res == ["foo"]
    }
    @Test
    void testWithoutClosure() {

        def mock = new MockFor(ClassWithoutClosure)
        mock.ignore('outer')
        def res = []
        mock.demand.inner {a -> res.add(a)}

        mock.use {
            def instance = new ClassWithoutClosure()

            instance.outer()
        }
        assert res == ["foo"]
    }

    @Test
    void testOverrideWithoutClosure() {
        ClassWithoutClosure inst = new ClassWithoutClosure()
        def res = []
        inst.metaClass.inner = {a -> res.add(a)}
        inst.outer()
        assert res == ['foo']
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...