首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

利用 Ruby 簡化 Java 測試(進階篇):Mock 技術與 JRuby 實戰

     編輯:Java 相關知識

測試依賴地獄與 Mock 救星

深度測試常陷入「依賴叢林」:需啟動資料庫、服務器、配置網絡,脆弱且緩慢。Mock 技術攔截並替換指定方法返回值,切斷對實際實現的依賴,實現真正的單元測試——快速、隔離、穩定。

JRuby + Mocha:極簡 Mock 體驗

JtestR 內建 Mocha 框架,語法極具 DSL 風格:

map = mock(HashMap)              # Mock 類
map.expects(:size).returns(5)    # 期望 size() 返回 5
assert_equal 5, map.size

實戰:EasyMock 經典範例移植

被測介面與類

public interface Collaborator {
    void documentAdded(String title);
    void documentChanged(String title);
    void documentRemoved(String title);
    byte voteForRemoval(String title);
    byte[] voteForRemovals(String[] title);
}

public class ClassUnderTest {
    public void addListener(Collaborator listener) { ... }
    public void addDocument(String title, byte[] doc) { ... }
    public boolean removeDocument(String title) { ... }
    public boolean removeDocuments(String[] titles) { ... }
}

Dust 測試框架 + Mocha 代碼

import "org.easymock.samples.ClassUnderTest"
import "org.easymock.samples.Collaborator"

unit_tests do
  cut = ClassUnderTest.new
  mock = Collaborator.new        # Mock 介面直接 new
  cut.addListener(mock)

  test "001 remove none existing document" do
    cut.removeDocument("Does not exist")
  end

  test "002 add document" do
    mock.expects(:documentAdded).with("New Document")
    cut.addDocument("New Document", [].to_java(:byte)) # Ruby 陣列轉 Java byte[]
  end

  test "003 add and change document" do
    mock.expects(:documentAdded).with("Document")
    mock.expects(:documentChanged).with("Document").times(3) # DSL: times(3)
    4.times { cut.addDocument("Document", [].to_java(:byte)) }
  end

  test "004 vote for removal" do
    mock.expects(:voteForRemoval).with("Document").returns(42)
    mock.expects(:documentRemoved).with("Document")
    assert_equal true, cut.removeDocument("Document")
  end
end

關鍵優勢對比

特性JRuby + MochaJava + EasyMock
語法風格DSL,語義化極強(.with().times().returns())API 呼鏈,較冗長
執行順序按方法名字母序,單上下文JUnit 多線程,順序不保證
類型轉換需顯式 .to_java(:byte)原生類型安全

加速測試執行

啟動 JtestR 內建測試服務器:mvn jtestr:server,後續 mvn test 將複用 JVM,大幅縮短啟動時間。

總結

JRuby + Mocha 以 DSL 風格 Mock API、極簡語法、強大語義表達力,大幅降低測試依賴處理難度。但 Mock 屬白盒測試,內部實現變更仍可能導致測試失效——技術降低難度,不消除問題本質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved