[英]How to Mock Static Java methods with JRuby and Mocha?
我的目標是使用JRuby和Mocha對帶有靜態實用程序方法的遺留Java代碼進行單元測試。 這可能嗎?
我正在嘗試應用JMockit中可用的類似技術。 一個利用代理來動態更改測試行為的框架。 純粹主義者可能建議重構靜態方法,但目前尚不可能。
我整理了兩個單元測試:
測試#1-Ruby Mocking-我的控制。
測試2-Java模擬-看看我是否可以在Java中完成相同的工作。
對於這兩個測試,我都將替換“ getTax”方法。
這是代碼:
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
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對象的代理而不能工作的原因?
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.