使用Easymock进行案例测试

问题描述 投票:0回答:1

我目前正在进行单元测试,我正在尝试创建一个测试以测试单个功能的不同情况的测试。例如,我具有以下功能:

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, arg1);

    /** 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(),并且效果很好。我将继续发布有关可能实施的改进的最新信息。

java unit-testing junit easymock
1个回答
1
投票

下面是更新的测试用例

@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个测试功能。每个描述多个测试用例。同样,每个测试用例都遵循以下模式

  1. 声明变量
  2. 描述测试用例
  3. 设定期望值
  4. 定义结果(实际)
  5. 应用断言
© www.soinside.com 2019 - 2024. All rights reserved.