【发布时间】:2010-12-02 03:05:41
【问题描述】:
我的目标是使用 JRuby 和 Mocha 对充满静态实用方法的遗留 Java 代码进行单元测试。这可能吗?
我正在尝试应用 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 失败: 预期但为 。好的,所以我不能那样做。唔。这不起作用的原因是因为 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) 灵活的测试隔离。
提前感谢您的回复!
【问题讨论】:
标签: java unit-testing static jruby mocha.js