View Javadoc
1   /*
2    * Copyright 2011-2024 the original author or authors.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *         https://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package com.googlecode.catchexception.throwable.apis;
17  
18  import com.googlecode.catchexception.throwable.CatchThrowable;
19  import com.googlecode.catchexception.throwable.ThrowingCallable;
20  
21  /**
22   * Supports <a href="http://en.wikipedia.org/wiki/Behavior_Driven_Development">BDD</a>-like approach to catch and verify
23   * throwables (<i>given/when/then</i>).
24   * <p>
25   * {@code
26   * import static com.googlecode.catchexception.throwable.apis
27   * .BDDCatchThrowable.*;
28   *
29   * // given an empty list
30   * List myList = new ArrayList();
31   *
32   * // when we try to get the first element of the list
33   * when(myList).get(1);
34   *
35   * // then we expect an IndexOutOfBoundsThrowable
36   * then(caughtThrowable())
37   * .isInstanceOf(IndexOutOfBoundsThrowable.class)
38   * .hasMessage("Index: 1, Size: 0")
39   * .hasNoCause();
40   *
41   * // then we expect an IndexOutOfBoundsThrowable (alternatively)
42   * thenThrown(IndexOutOfBoundsThrowable.class);
43   * }
44   */
45  public class BDDCatchThrowable {
46  
47      /**
48       * When.
49       *
50       * @param actor
51       *            The instance that shall be proxied. Must not be <code>null</code>.
52       *
53       * @see com.googlecode.catchexception.throwable.CatchThrowable#catchThrowable(ThrowingCallable)
54       */
55      public static void when(ThrowingCallable actor) {
56          CatchThrowable.catchThrowable(actor);
57      }
58  
59      /**
60       * Returns the throwable caught during the last call on the proxied object in the current thread.
61       *
62       * @return Returns the throwable caught during the last call on the proxied object in the current thread - if the
63       *         call was made through a proxy that has been created via {@link #when(ThrowingCallable)}. Returns null the
64       *         proxy has not caught an throwable. Returns null if the caught throwable belongs to a class that is no
65       *         longer {@link ClassLoader loaded}.
66       */
67      public static Throwable caughtThrowable() {
68          return CatchThrowable.caughtThrowable();
69      }
70  
71      /**
72       * Caught throwable.
73       *
74       * @param <T>
75       *            the generic type
76       * @param caughtThrowableType
77       *            the caught throwable type
78       *
79       * @return the t
80       *
81       * @deprecated Use caghtThrowable() instead as the passed argument does nothing
82       */
83      @Deprecated(since = "2.3.0", forRemoval = true)
84      public static <T extends Throwable> T caughtThrowable(Class<T> caughtThrowableType) {
85          return CatchThrowable.caughtThrowable(caughtThrowableType);
86      }
87  
88      /**
89       * Throws an assertion if no throwable is thrown or if an throwable of an unexpected type is thrown.
90       * <p>
91       * EXAMPLE: <code>// given a list with nine members
92       List myList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
93  
94       // when we try to get the 500th member of the fellowship
95       when(myList).get(500);
96  
97       // then we expect an IndexOutOfBoundsThrowable
98       thenThrown(IndexOutOfBoundsThrowable.class);
99       </code>
100      *
101      * @param actualThrowableClazz
102      *            the expected type of the caught throwable.
103      */
104     @SuppressWarnings("rawtypes")
105     public static void thenThrown(Class actualThrowableClazz) {
106         CatchThrowableUtils.thenThrown(actualThrowableClazz);
107     }
108 
109 }