Home | History | Annotate | Download | only in stubbing
      1 /*
      2  * Copyright (c) 2007 Mockito contributors
      3  * This program is made available under the terms of the MIT License.
      4  */
      5 package org.mockito.internal.stubbing;
      6 
      7 import java.io.Serializable;
      8 import java.util.Queue;
      9 import java.util.concurrent.ConcurrentLinkedQueue;
     10 
     11 import org.mockito.internal.invocation.InvocationMatcher;
     12 import org.mockito.invocation.DescribedInvocation;
     13 import org.mockito.invocation.InvocationOnMock;
     14 import org.mockito.stubbing.Answer;
     15 
     16 @SuppressWarnings("unchecked")
     17 public class StubbedInvocationMatcher extends InvocationMatcher implements Answer, Serializable {
     18 
     19     private static final long serialVersionUID = 4919105134123672727L;
     20     private final Queue<Answer> answers = new ConcurrentLinkedQueue<Answer>();
     21     private DescribedInvocation usedAt;
     22 
     23     public StubbedInvocationMatcher(InvocationMatcher invocation, Answer answer) {
     24         super(invocation.getInvocation(), invocation.getMatchers());
     25         this.answers.add(answer);
     26     }
     27 
     28     public Object answer(InvocationOnMock invocation) throws Throwable {
     29         //see ThreadsShareGenerouslyStubbedMockTest
     30         Answer a;
     31         synchronized(answers) {
     32             a = answers.size() == 1 ? answers.peek() : answers.poll();
     33         }
     34         return a.answer(invocation);
     35     }
     36 
     37     public void addAnswer(Answer answer) {
     38         answers.add(answer);
     39     }
     40 
     41     public void markStubUsed(DescribedInvocation usedAt) {
     42         this.usedAt = usedAt;
     43     }
     44 
     45     public boolean wasUsed() {
     46         return usedAt != null;
     47     }
     48 
     49     @Override
     50     public String toString() {
     51         return super.toString() + " stubbed with: " + answers;
     52     }
     53 }