簡體   English   中英

如何使用JRuby和Mocha模擬靜態Java方法?

[英]How to Mock Static Java methods with JRuby and Mocha?

我的目標是使用JRuby和Mocha對帶有靜態實用程序方法的遺留Java代碼進行單元測試。 這可能嗎?

我正在嘗試應用JMockit中可用的類似技術。 一個利用代理來動態更改測試行為的框架。 純粹主義者可能建議重構靜態方法,但目前尚不可能。

我整理了兩個單元測試:

測試#1-Ruby Mocking-我的控制。
測試2-Java模擬-看看我是否可以在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失敗,並出現: 好的,所以我不能這樣做。 是不是因為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)靈活測試隔離。

預先感謝您的回復!

我知道這個問題是很久以前提出的,但是我遇到了一個非常類似的問題,終於使它起作用了。 我認為問題出在您使用any_instance ...

至少在我的方案中,解決方案是直接在包含靜態方法的類上調用存根:

InvoiceUtil.stubs(:getTax).returns(1.18)

我還沒有使用過它,但是Ola Bini不久前發布了JtestR ,這可能就是您想要的。 看來他已經解決了您在上面看到的any_instance問題。 我不知道JtestR是什么最新版本,但是查看Ola的GitHub帳戶,有一些最新的commit ,所以您可能會很幸運。 我希望這有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM