Моя цель - провести модульное тестирование унаследованного кода Java, пронизанного статическими служебными методами, с использованием JRuby и Mocha.Это возможно?
Я пытаюсь применить похожие методы, доступные в JMockit;фреймворк, использующий прокси для динамического изменения поведения теста.Пуристы могут предложить рефакторинг статических методов, но на данный момент это просто невозможно.
Я собрал два модульных теста:
Тест № 1 - Ruby Mocking - мой контроль.
Тест № 2 - Java Mocking - чтобы узнать, смогу ли я выполнить то же самое в Java.
Для обоих тестов я заменяю метод "getTax".
Вот код:
Тест 1
require 'rubygems'
require 'dust'
require 'mocha'
unit_tests do
# Test 1 - Stub out JRuby secondary class and override the "getTax" method
# This is my "control" - I'm overriding the tax multiplier from 1.15 to 1.18.
# It works =)
test "RubyMocking" do
# System Under Test
class RInvoice
def initialize
@util = RInvoiceUtil.new
end
def calculate
@util.getTax * 10.0
end
end
# Dependency
class RInvoiceUtil
# we'll stub out this method and change the tax rate
def getTax
1.15
end
end
invoice = RInvoice.new
# change the tax rate
RInvoiceUtil.any_instance.stubs(:getTax).returns(1.18)
assert_equal(invoice.calculate.to_s, "11.8")
end
end
Тест 2
include Java
require 'rubygems'
require 'dust'
require 'mocha'
require 'invoice.jar'
Invoice = Java::example.Invoice
InvoiceUtil = Java::example.InvoiceUtil
unit_tests do
# Test 2 - Stub out Java class InvoiceUtil and it's *static* getTax method.
# This can be achieved via JMockit, but is it possible in Mocha?
test "JavaMocking" do
invoice = Invoice.new
# this does not work because the ruby objects are only
# proxies to the java objects?
InvoiceUtil.any_instance.stubs(:getTax).returns(1.18)
assert_equal(invoice.calculate, 11.8)
end
end
Тест 2 не пройден с: <11,5> ожидаемым, но было <11,8> .Хорошо, я не могу этого сделать.Хм.Это причина того, что это не работает, потому что объекты ruby являются только прокси для объектов java?
Источник Java
package example;
public class Invoice {
public double calculate() {
return InvoiceUtil.getTax() * 10.0;
}
}
public class InvoiceUtil {
public static double getTax() {
return 1.15;
}
}
Подводя итог
Все, что я хочу сделатьэто объединение статического метода насмешек с JRuby для использования (1) простого написания сценариев с (2) гибкой изоляцией теста.
Заранее спасибо за ваши ответы!