簡體   English   中英

使用 Easymock 進行案例測試

[英]Test with Easymock for cases testing

我目前正在進行單元測試,並且我正在嘗試創建一個測試來測試單個函數的不同情況。 例如,我有以下功能:

public static String foo(Object arg0, Object arg1) {
    String returnValue = null;
    if(arg0.getName() != null && arg0.getId() != null) {
        returnValue = "Value 1";
    } else if (arg1.getName() != null && arg1.getId() != null ) {
        returnValue = "Value 2";
    }
    return returnValue;
}

我想測試以下情況:

  • 情況 1: arg0.getName() == nullarg1.getName() == null
  • 情況 2: arg0.getName() != nullarg0.getId() != nullarg1.getName() == null
  • 情況 3: arg0.getName() == nullarg1.getName() != nullarg1.getId() != null

等等...

我目前的測試是這樣的:

public void testFoo() {
    /** Setting up my mocks**/
    Obj arg0 = createMock(Obj.class);
    Obj arg1 = createMock(Obj.class);

    /** Setting my mocks behaviors **/

    // Case 1
    EasyMock.expect(arg0.getName()).andReturn(null);
    EasyMock.expect(arg1.getName()).andReturn(null);

    // Case 2
    EasyMock.expect(arg0.getName()).andReturn("Jack");
    EasyMock.expect(arg0.getId()).andReturn(1);
    EasyMock.expect(arg1.getName()).andReturn(null);

    // Case 3
    EasyMock.expect(arg0.getName()).andReturn(null);
    EasyMock.expect(arg1.getName()).andReturn("Paul");
    EasyMock.expect(arg1.getId()).andReturn(2);

    //End Cases
    EasyMock.replay(arg0_case1, arg0_case2, arg0_case3,

arg1_case1, arg1_case2, arg1_case3);

    /** Testing **/

    // Case 1
    String expectedValue = null;
    String output = foo(arg0, arg1);
    assertEquals(expectedValue, output);

    // Case 2
    expectedValue = "Value 1";
    output = foo(arg0, arg1);
    assertEquals(expectedValue, output);

    // Case 3
    expectedValue = "Value 2";
    output = foo(arg0, arg1);
    assertEquals(expectedValue, output);
}

我在這個測試中遇到的問題是,即使我為每個測試用例設置了模擬,但設置似乎無法遵循我選擇的順序。 我試圖添加一個.once()atLeastOnce() ,但即便如此,它也失敗了。

您對此類測試有任何解決方案嗎? 也許我應該為每個案例編寫不同的測試?


編輯我找到了一個解決方案,這要歸功於@swayamraina 的解決方案和對我的代碼的一些修改。 這不是最有效的答案,但它可以完成工作。 這是我編輯的代碼:

public void testFoo() {
/** Setting my mocks behaviors **/

// Case 1
Obj arg0_case1 = createMock(Obj.class);
Obj arg1_case1 = createMock(Obj.class);
EasyMock.expect(arg0_case1.getName()).andReturn(null).anyTimes();
EasyMock.expect(arg1_case1.getName()).andReturn(null).anyTimes();

// Case 2
Obj arg0_case2 = createMock(Obj.class);
Obj arg1_case2 = createMock(Obj.class);
EasyMock.expect(arg0_case2.getName()).andReturn("Jack").anyTimes();
EasyMock.expect(arg0_case2.getId()).andReturn(1).anyTimes();
EasyMock.expect(arg1_case2.getName()).andReturn(null).anyTimes();

// Case 3
Obj arg0_case3 = createMock(Obj.class);
Obj arg1_case3 = createMock(Obj.class);
EasyMock.expect(arg0_case3.getName()).andReturn(null).anyTimes();
EasyMock.expect(arg1_case3.getName()).andReturn("Paul").anyTimes();
EasyMock.expect(arg1_case3.getId()).andReturn(2).anyTimes();

//End Cases
EasyMock.replay(arg0, arg1);

/** Testing **/

// Case 1
String expectedValue = null;
String output = foo(arg0_case1, arg1_case1);
assertEquals(expectedValue, output);

// Case 2
expectedValue = "Value 1";
output = foo(arg0_case2, arg1_case2);
assertEquals(expectedValue, output);

// Case 3
expectedValue = "Value 2";
output = foo(arg0_case3, arg1_case3);
assertEquals(expectedValue, output);

就像@swayamraina 在其答案中提出的那樣,我為每個案例測試創建了不同的.anyTimes() ,並在每個EasyMock.expect().andReturn()之后添加了一個EasyMock.expect().andReturn() ,並且效果很好。 我會在這篇文章中更新我可能實施的改進。

下面是更新的測試用例

@Test
public void test()  {

  A arg0, arg1;

  // Case 1
  arg0 = EasyMock.createMock(A.class);
  arg1 = EasyMock.createMock(A.class);

  // expectations
  EasyMock.expect(arg0.getName()).andReturn(null).once();
  EasyMock.expect(arg1.getName()).andReturn(null).once();
  EasyMock.replay(arg0, arg1);

  // actuals
  String expectedValue = null;
  String output = foo(arg0, arg1);

  // assertions
  Assert.assertEquals(expectedValue, output);


  // Case 2
  arg0 = EasyMock.createMock(A.class);
  arg1 = EasyMock.createMock(A.class);

  // expectations
  EasyMock.expect(arg0.getName()).andReturn("Jack").once();
  EasyMock.expect(arg0.getId()).andReturn(1).once();
  EasyMock.expect(arg1.getName()).andReturn(null).once();
  EasyMock.replay(arg0, arg1);

  // actuals
  expectedValue = "Value 1";
  output = foo(arg0, arg1);

  // assertions
  Assert.assertEquals(expectedValue, output);


  // Case 3
  arg0 = EasyMock.createMock(A.class);
  arg1 = EasyMock.createMock(A.class);

  // expectations
  EasyMock.expect(arg0.getName()).andReturn(null).once();
  EasyMock.expect(arg1.getName()).andReturn("Paul").once();
  EasyMock.expect(arg1.getId()).andReturn(2).once();
  EasyMock.replay(arg0, arg1);

  // actuals
  expectedValue = "Value 2";
  output = foo(arg0, arg1);

  // assertions
  Assert.assertEquals(expectedValue, output);
}



使用的測試類:

class A {
    String name; public String getName() {return  name;} 
    Integer id; public Integer getId(){return id;}
}


筆記:
您只能重播一次模擬。 您需要為每個測試用例創建新的測試對象。 在這里,我們首先創建模擬,然后設置期望並重放模擬。 最后根據實際值進行斷言。


作為一般過程,我喜歡使用 . 描述每個的多個測試用例。
每個測試用例也遵循以下模式

  1. 聲明變量
  2. 描述測試用例
  3. 設定期望
  4. 定義結果(實際)
  5. 應用斷言

暫無
暫無

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

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