У меня есть два класса, которые я тестирую.У них обеих есть две функции (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']
}
}