有 Java 编程相关的问题?

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

java EasyMock和修改可变方法参数

如何使用EasyMock修改模拟方法的可变方法参数

例如,我有一个使用BlockingQueue的类。我想模拟BlockingQueue成员进行单元测试。我的类调用方法队列。德兰托(c组)。调用此方法将从队列中删除元素并将其添加到集合中。我如何使用EasyMock模拟这种行为?举个例子就好了


共 (2) 个答案

  1. # 1 楼答案

    很难说清楚你的代码是什么样子的。如果我知道你要测试的代码,我会帮你更好。。但假设要测试的代码如下所示:

    private BlockingQueue<String> queue;
    private List<String>  myList = new ArrayList<String> ():
    
    private void setBlockingQueue( BlockingQueue<String>  queue ) { 
        this.queue = queue;
    }
    
    public List<String> getMyList() {
        return myList;
    }
    
    public void setMyList( List<String> myList) {
        this.myList = myList;
    }
    
    public void doWork() {
        System.out.println("blah");
        queue.drainTo( myList );
    }
    

    测试将是

    public void testDoWork() {
        List<String> stuffToDrain = new ArrayList<String>();
        stuffToDrain.add( "foo" );
        stuffToDrain.add( "bar" );
        myTestingClass.setMyList( stuffToTrain );
    
    
        BlockingQueue<String> queue = EasyMock.createMock( BlockingQueue.class  );
        myTestingClass.setBlockingQueue( queue );
        queue.drainTo( stuffToDrain );
        EasyMock.replay( queue );
        myTestingClass.doWork();
        EasyMock.verify( queue );
    
    
    
    }
    

    抱歉,如果这不正确,但很难建议对我看不到的代码进行测试

    编辑-我们不能断言可变参数会因为我们如何使用mock而改变。我们所能做的就是断言drainTo方法被调用。如果德兰托做了我们想做的事情,就必须在其他地方进行测试。。i、 e.在阻塞队列的测试中。阶级

    编辑2-我们可以更具体地说明我们希望用什么列表调用该方法

  2. # 2 楼答案

    您可以使用andAnswergetCurrentArguments

    public void testDrainToQueue() {
      BlockingQueue<Foo> queue = EasyMock.createMock(BlockingQueue.class);
      EasyMock.expect(queue.drainTo(EasyMock.isA(List.class)))
          .andAnswer(new IAnswer<Integer>() {
            public Integer answer() {
              ((List) EasyMock.getCurrentArguments()[0]).add(new Foo(123));
              return 1; // 1 element drained
            }
          });
      EasyMock.replay(queue);
      ...
    }
    

    提取帮助器类或方法有时会有所帮助:

    private static IAnswer<Integer> fakeDrainReturning(final List drainedElements) {
      return new IAnswer<Integer() {
        @Override public Integer answer() {
          ((List) EasyMock.getCurrentArguments()[0]).addAll(drainedElements);
          return drainedElements.size();
        }
      };
    }
    

    然后你可以做:

    List<Foo> drainedElements = Arrays.asList(new Foo(123), new Foo(42));
    EasyMock.expect(queue.drainTo(EasyMock.isA(List.class)))
        .andAnswer(fakeDrainReturning(drainedElements));
    

    最好使用实数BlockingQueue,并找到一种方法,在希望从队列中删除数据的方法之前将所需的值插入队列