• 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 
6 package org.mockito.internal.stubbing.defaultanswers;
7 
8 import org.junit.Assume;
9 import org.junit.Test;
10 import org.mockito.invocation.Invocation;
11 import org.mockitoutil.TestBase;
12 
13 import java.util.*;
14 
15 import static org.junit.Assert.*;
16 import static org.mockito.Mockito.mock;
17 
18 public class ReturnsEmptyValuesTest extends TestBase {
19 
20     private final ReturnsEmptyValues values = new ReturnsEmptyValues();
21 
22     @Test
should_return_empty_collections_or_null_for_non_collections()23     public void should_return_empty_collections_or_null_for_non_collections() {
24         assertTrue(((Collection<?>) values.returnValueFor(Collection.class)).isEmpty());
25 
26         assertTrue(((Set<?>) values.returnValueFor(Set.class)).isEmpty());
27         assertTrue(((SortedSet<?>) values.returnValueFor(SortedSet.class)).isEmpty());
28         assertTrue(((HashSet<?>) values.returnValueFor(HashSet.class)).isEmpty());
29         assertTrue(((TreeSet<?>) values.returnValueFor(TreeSet.class)).isEmpty());
30         assertTrue(((LinkedHashSet<?>) values.returnValueFor(LinkedHashSet.class)).isEmpty());
31 
32         assertTrue(((List<?>) values.returnValueFor(List.class)).isEmpty());
33         assertTrue(((ArrayList<?>) values.returnValueFor(ArrayList.class)).isEmpty());
34         assertTrue(((LinkedList<?>) values.returnValueFor(LinkedList.class)).isEmpty());
35 
36         assertTrue(((Map<?, ?>) values.returnValueFor(Map.class)).isEmpty());
37         assertTrue(((SortedMap<?, ?>) values.returnValueFor(SortedMap.class)).isEmpty());
38         assertTrue(((HashMap<?, ?>) values.returnValueFor(HashMap.class)).isEmpty());
39         assertTrue(((TreeMap<?, ?>) values.returnValueFor(TreeMap.class)).isEmpty());
40         assertTrue(((LinkedHashMap<?, ?>) values.returnValueFor(LinkedHashMap.class)).isEmpty());
41 
42         assertNull(values.returnValueFor(String.class));
43     }
44 
45     @Test
should_return_empty_iterable()46     public void should_return_empty_iterable() throws Exception {
47         assertFalse(((Iterable<?>) values.returnValueFor(Iterable.class)).iterator().hasNext());
48     }
49 
50     @Test
should_return_primitive()51     public void should_return_primitive() {
52         assertEquals(false, values.returnValueFor(Boolean.TYPE));
53         assertEquals((char) 0, values.returnValueFor(Character.TYPE));
54         assertEquals((byte) 0, values.returnValueFor(Byte.TYPE));
55         assertEquals((short) 0, values.returnValueFor(Short.TYPE));
56         assertEquals(0, values.returnValueFor(Integer.TYPE));
57         assertEquals(0L, values.returnValueFor(Long.TYPE));
58         assertEquals(0F, values.returnValueFor(Float.TYPE));
59         assertEquals(0D, values.returnValueFor(Double.TYPE));
60     }
61 
62     @Test
should_return_non_zero_for_compareTo_method()63     public void should_return_non_zero_for_compareTo_method() {
64         //
65         // given
66         Date d = mock(Date.class);
67         d.compareTo(new Date());
68         Invocation compareTo = this.getLastInvocation();
69 
70         //when
71         Object result = values.answer(compareTo);
72 
73         //then
74         assertTrue(result != (Object) 0);
75     }
76 
77     @SuppressWarnings("SelfComparison")
78     @Test
should_return_zero_if_mock_is_compared_to_itself()79     public void should_return_zero_if_mock_is_compared_to_itself() {
80         //given
81         Date d = mock(Date.class);
82         d.compareTo(d);
83         Invocation compareTo = this.getLastInvocation();
84 
85         //when
86         Object result = values.answer(compareTo);
87 
88         //then
89         assertEquals(0, result);
90     }
91 
92     @Test
should_return_empty_Optional()93     public void should_return_empty_Optional() throws Exception {
94         verify_empty_Optional_is_returned("java.util.stream.Stream", "java.util.Optional");
95     }
96 
97     @Test
should_return_empty_OptionalDouble()98     public void should_return_empty_OptionalDouble() throws Exception {
99         verify_empty_Optional_is_returned("java.util.stream.DoubleStream", "java.util.OptionalDouble");
100     }
101 
102     @Test
should_return_empty_OptionalInt()103     public void should_return_empty_OptionalInt() throws Exception {
104         verify_empty_Optional_is_returned("java.util.stream.IntStream", "java.util.OptionalInt");
105     }
106 
107     @Test
should_return_empty_OptionalLong()108     public void should_return_empty_OptionalLong() throws Exception {
109         verify_empty_Optional_is_returned("java.util.stream.LongStream", "java.util.OptionalLong");
110     }
111 
verify_empty_Optional_is_returned(String streamFqcn, String optionalFqcn)112     private void verify_empty_Optional_is_returned(String streamFqcn, String optionalFqcn) throws Exception {
113         Class<?> streamType = getClassOrSkipTest(streamFqcn);
114 
115         //given
116         Object stream = mock(streamType);
117         Object optional = streamType.getMethod("findAny").invoke(stream);
118         assertNotNull(optional);
119         assertFalse((Boolean) Class.forName(optionalFqcn).getMethod("isPresent").invoke(optional));
120 
121         Invocation findAny = this.getLastInvocation();
122 
123         //when
124         Object result = values.answer(findAny);
125 
126         //then
127         assertEquals(optional, result);
128     }
129 
130     @Test
should_return_empty_Stream()131     public void should_return_empty_Stream() throws Exception {
132         verify_empty_Stream_is_returned("java.util.stream.Stream");
133     }
134 
135     @Test
should_return_empty_DoubleStream()136     public void should_return_empty_DoubleStream() throws Exception {
137         verify_empty_Stream_is_returned("java.util.stream.DoubleStream");
138     }
139 
140     @Test
should_return_empty_IntStream()141     public void should_return_empty_IntStream() throws Exception {
142         verify_empty_Stream_is_returned("java.util.stream.IntStream");
143     }
144 
145     @Test
should_return_empty_LongStream()146     public void should_return_empty_LongStream() throws Exception {
147         verify_empty_Stream_is_returned("java.util.stream.LongStream");
148     }
149 
verify_empty_Stream_is_returned(String streamFqcn)150     private void verify_empty_Stream_is_returned(String streamFqcn) throws Exception {
151         // given
152         Class<?> streamType = getClassOrSkipTest(streamFqcn);
153 
154         // when
155         Object stream = values.returnValueFor(streamType);
156         long count = (Long) streamType.getMethod("count").invoke(stream);
157 
158         // then
159         assertEquals("count of empty " + streamFqcn, 0L, count);
160     }
161 
162     /**
163      * Tries to load the given class. If the class is not found, the complete test is skipped.
164      */
getClassOrSkipTest(String className)165     private Class<?> getClassOrSkipTest(String className) {
166         try {
167             return Class.forName(className);
168         } catch (ClassNotFoundException e) {
169             Assume.assumeNoException("JVM does not support " + className, e);
170             return null;
171         }
172     }
173 
174 }
175