• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
StubbedInvocationMatcher(InvocationMatcher invocation, Answer answer)23     public StubbedInvocationMatcher(InvocationMatcher invocation, Answer answer) {
24         super(invocation.getInvocation(), invocation.getMatchers());
25         this.answers.add(answer);
26     }
27 
answer(InvocationOnMock invocation)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 
addAnswer(Answer answer)37     public void addAnswer(Answer answer) {
38         answers.add(answer);
39     }
40 
markStubUsed(DescribedInvocation usedAt)41     public void markStubUsed(DescribedInvocation usedAt) {
42         this.usedAt = usedAt;
43     }
44 
wasUsed()45     public boolean wasUsed() {
46         return usedAt != null;
47     }
48 
49     @Override
toString()50     public String toString() {
51         return super.toString() + " stubbed with: " + answers;
52     }
53 }