有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我无法编写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) 个答案

  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. # 2 楼答案

    如果你想检查输出结果,你可以

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

  3. # 3 楼答案

    构造函数不使用传入的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方法。当mock处于重播状态时,只需调用mock上的方法

    所以你只要说

    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'sexpectLastCall()

     //this is the expectation
    mock.snmpGetTable(boardOIDs, oidsList,valuesList);
    
    expectLastCall().andThrow( new Exception(... ));
    

    有关更多详细信息,请参见Easymock documentation