【问题标题】:How to write test method for void method in junit easymock in java? [duplicate]java - 如何在java中的junit easymock中为void方法编写测试方法? [复制]
【发布时间】:2013-12-12 12:38:05
【问题描述】:

我无法编写 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);

    }       
    }

【问题讨论】:

    标签: java junit easymock


    【解决方案1】:

    您的构造函数不使用传入的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 上的方法即可。

    所以期待您直接说给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了解更多详情

    【讨论】:

      【解决方案2】:

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

      @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

      【讨论】:

      • 我想模拟 snmp..我想写 testValueListSize().. 但是 snmp 类是第三方源代码..我写了测试用例。但值列表大小总是为零,我得到了
      • 只是为了澄清:你想模拟方法'snmpGetTable'并期望变量'valuesList'不为空吗?
      • 没有。那是已经模拟的第三方源代码方法 Creatmock(Snmp.class);但在添加后,我在“snmpGetTable”中的值也为空。
      • 'expect' 我的意思是 valuesList 在调用模拟之后被填充。这样最后一行打印出“Value List size1”或“Value List size2”。这就是你想要的吗?
      • 是的。实际上大小是 1。但即使我嘲笑 Snmp 类,我也总是得到 0。 :-(
      【解决方案3】:

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

      但是,您的方法并非旨在轻松捕获输出,因为您没有传入输出流。不过,您可以模拟 System.out.println,并确保它得到正确的参数。

      【讨论】:

        猜你喜欢
        • 2023-02-17
        • 1970-01-01
        • 1970-01-01
        • 2012-07-27
        • 1970-01-01
        • 2021-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多