Как я могу отключить вызов super в импортированном классе Java в JRuby для тестирования

Я тестирую классы Java с RSpec и JRuby.

Как я могу заглушить вызов super в импортированном классе Java в моем тесте RSpec?

Например:

У меня есть 2 класса Java:

public class A{
  public String foo() {
    return "bar";
  }
}

public class B extends A
  public String foo() {
    // B code
    return super.foo();
  } 
}

Я просто пытаюсь протестировать код в B.foo, а не код в A.foo с JRuby. Как я могу заглушить вызов метода суперкласса в моем тесте RSpec?

тест rspec:

java_import Java::B

describe B do
  it "should not call A.foo" do
    # some code to stub out A.foo
    b = B.new
    b.foo.should_not == "bar"
  end
end

Я попытался включить модуль с новым методом foo в класс B, надеясь, что он сначала вызовет метод модуля, но B по-прежнему вызывает A. Техника вставки модуля работает в Ruby, но не с JRuby и импортированными классами Java.

Любые другие идеи, чтобы заглушить метод суперкласса, чтобы мой тест RSpec прошел?


person Doug Chew    schedule 27.02.2010    source источник


Ответы (1)


Я не думаю, что вы можете, и это кажется нелогичным. Вызов метода foo() для super.foo() является частью его реализации - в принципе, это может быть необходимо для его правильного поведения.

Возможно, функциональность, которую вы хотите протестировать отдельно, должна быть выделена в отдельный метод и вызываться из foo() и при тестировании?

person Lawrence Dol    schedule 27.02.2010
comment
Я согласен, что рефакторинг для тестирования может быть самым простым решением. Иногда труднее провести рефакторинг, особенно если я использую библиотеку поставщика. Я надеюсь, что я все еще могу сделать это в JRuby, поскольку это вариант в Ruby. Было бы неплохо иметь еще один инструмент для тестирования. - person Doug Chew; 27.02.2010