如何在java中的junit easymock中编写void方法的测试方法?

时间:2013-12-12 12:38:06

标签: java junit easymock

我无法编写easymock或期望使用void方法。我想为Board编写测试类。请允许任何人帮助我...这样的课程如下所示

 public class Board{
    Snmp snmp;
    Board(Snmp snmp){
    this.snmp = new Snmp();
    }
    private void readTable() throws SnmpException {
            ArrayList<String> boardOIDs = new ArrayList<String>();
            List<List<String>> valuesList = new ArrayList<List<String>>();
            List<List<String>> oidsList = new ArrayList<List<String>>();

            boardOIDs.add(OID_BOARD_INDEX);
            boardOIDs.add(OID_BOARDNAME);
            boardOIDs.add(OID_BOARDTYPE);

            //this method read and put value into valueList
            snmp.snmpGetTable(boardOIDs, oidsList,valuesList);

            s.o.p( "Value List size" +valuesList.size);

    }       
    }

3 个答案:

答案 0 :(得分:2)

您的构造函数不使用传入的snmp实例,而是创建一个新实例。你为什么这样做?

Board(Snmp snmp){
  this.snmp = new Snmp();
}

应该是

Board(Snmp snmp){
  this.snmp = snmp;
}

然后你可以使用easymock创建一个模拟Snmp实例并将其传递给Board的构造函数。

Snmp mock = createMock(Snmp.class);

Board board = new Board(mock);

要期望easymock中的void方法,您不需要使用expect方法。当模拟处于重放状态时,只需在模拟上调用方法。

所以期待拨打snmpGetTable(),你只需说

ArrayList<String> boardOIDs = ...
List<List<String>> valuesList =...
List<List<String>> oidsList = ...

Snmp mock = createMock(Snmp.class);

//this is the expectation
mock.snmpGetTable(boardOIDs, oidsList,valuesList);
//now replay the mock
replay(mock);

Board board = new Board(mock);

如果您需要从void方法中抛出异常,可以使用easymock's expectLastCall()

 //this is the expectation
mock.snmpGetTable(boardOIDs, oidsList,valuesList);

expectLastCall().andThrow( new Exception(... ));

有关详细信息,请参阅Easymock documentation

答案 1 :(得分:1)

您可以训练模拟使用答案:

@Test
public void testReadTable() {
    Snmp snmp = createMock(Snmp.class);
    snmp.snmpGetTable(anyObject(List.class), anyObject(List.class), anyObject(List.class));

    IAnswer answer = new IAnswer() {

        @Override
        public Object answer() throws Throwable {
            List list = (List) getCurrentArguments()[2];
            list.add("a");
            return null;
        }
    };

    expectLastCall().andAnswer(answer);
    replay(snmp);

    Board board = new Board(snmp);
    board.readTable();

    verify(snmp);
}

请注意,您需要修复Board类的构造函数,并使该方法至少默认为可见或以任何其他方式调用它。

...
Board(Snmp snmp){
   this.snmp = snmp;
}

void readTable(){
...

另见答案:easymock-void-methods

答案 2 :(得分:0)

如果要检查输出结果,可以

但是,您的方法不是为了便于捕获输出而设计的,因为您没有传入输出流。但是,您可以模拟System.out.println,并确保它获得正确的参数。