Как смоделировать статические методы Java с помощью JRuby и Mocha? - PullRequest
1 голос
/ 02 декабря 2010

Моя цель - провести модульное тестирование унаследованного кода 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) гибкой изоляцией теста.

Заранее спасибо за ваши ответы!

Ответы [ 2 ]

1 голос
/ 09 сентября 2014

Я понимаю, что этот вопрос задавали очень давно, но я столкнулся с очень похожей проблемой и, наконец, получил ее работу.Я думаю, что проблема в том, что вы используете any_instance ...

По крайней мере, в моем сценарии решение состояло в том, чтобы вызывать заглушки непосредственно в классе, содержащем статический метод:

InvoiceUtil.stubs(:getTax).returns(1.18)
0 голосов
/ 02 декабря 2010

Я сам этим не пользовался, но Ola Bini недавно выпустил JtestR , что может быть тем, что вы ищете.Похоже, он решил проблему any_instance, которую вы видите выше.Я понятия не имею, насколько современным является JtestR, но, глядя на учетную запись Олы на GitHub, есть несколько недавних коммитов , так что вам повезет.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...