View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau.commons.reflect;
18  
19  import static org.junit.jupiter.api.Assertions.*;
20  
21  import org.apache.juneau.*;
22  import org.junit.jupiter.api.*;
23  
24  /**
25   * Tests for {@link BeanRuntimeException}.
26   */
27  class BeanRuntimeException_Test extends TestBase {
28  
29  	//====================================================================================================
30  	// Constructor with Class and message
31  	//====================================================================================================
32  
33  	@Test
34  	void a01_constructor_withClassAndMessage_formatsMessage() {
35  		var ex = new BeanRuntimeException(String.class, "Test message");
36  		assertNotNull(ex);
37  		assertTrue(ex.getMessage().contains("String"));
38  		assertTrue(ex.getMessage().contains("Test message"));
39  		assertNull(ex.getCause());
40  	}
41  
42  	@Test
43  	void a02_constructor_withClassAndMessageWithArgs_formatsMessage() {
44  		var ex = new BeanRuntimeException(Integer.class, "Value is {0}", 42);
45  		assertNotNull(ex);
46  		assertTrue(ex.getMessage().contains("Integer"));
47  		assertTrue(ex.getMessage().contains("42"));
48  		assertNull(ex.getCause());
49  	}
50  
51  	@Test
52  	void a03_constructor_withClassAndNullMessage_handlesNull() {
53  		String nullMessage = null;
54  		var ex = new BeanRuntimeException(String.class, nullMessage);
55  		assertNotNull(ex);
56  		assertNull(ex.getMessage());
57  		assertNull(ex.getCause());
58  	}
59  
60  	//====================================================================================================
61  	// Constructor with message only
62  	//====================================================================================================
63  
64  	@Test
65  	void b01_constructor_withMessage_createsException() {
66  		var ex = new BeanRuntimeException("Simple message");
67  		assertNotNull(ex);
68  		assertEquals("Simple message", ex.getMessage());
69  		assertNull(ex.getCause());
70  	}
71  
72  	@Test
73  	void b02_constructor_withMessageAndArgs_formatsMessage() {
74  		var ex = new BeanRuntimeException("Value is {0}", 123);
75  		assertNotNull(ex);
76  		assertTrue(ex.getMessage().contains("123"));
77  		assertNull(ex.getCause());
78  	}
79  
80  	@Test
81  	void b03_constructor_withNullMessage_handlesNull() {
82  		String nullMessage = null;
83  		var ex = new BeanRuntimeException(nullMessage);
84  		assertNotNull(ex);
85  		assertNull(ex.getMessage());
86  		assertNull(ex.getCause());
87  	}
88  
89  	//====================================================================================================
90  	// Constructor with Throwable only
91  	//====================================================================================================
92  
93  	@Test
94  	void c01_constructor_withThrowable_wrapsException() {
95  		var cause = new IllegalArgumentException("Original error");
96  		var ex = new BeanRuntimeException(cause);
97  		assertNotNull(ex);
98  		assertSame(cause, ex.getCause());
99  		assertTrue(ex.getMessage().contains("Original error"));
100 	}
101 
102 	@Test
103 	void c02_constructor_withNullThrowable_handlesNull() {
104 		Throwable nullCause = null;
105 		var ex = new BeanRuntimeException(nullCause);
106 		assertNotNull(ex);
107 		assertNull(ex.getCause());
108 		assertNull(ex.getMessage());
109 	}
110 
111 	//====================================================================================================
112 	// Constructor with Throwable, Class, and message
113 	//====================================================================================================
114 
115 	@Test
116 	void d01_constructor_withCauseClassAndMessage_formatsMessage() {
117 		var cause = new RuntimeException("Underlying error");
118 		var ex = new BeanRuntimeException(cause, String.class, "Wrapper message");
119 		assertNotNull(ex);
120 		assertSame(cause, ex.getCause());
121 		assertTrue(ex.getMessage().contains("String"));
122 		assertTrue(ex.getMessage().contains("Wrapper message"));
123 	}
124 
125 	@Test
126 	void d02_constructor_withCauseClassAndMessageWithArgs_formatsMessage() {
127 		var cause = new RuntimeException("Underlying error");
128 		var ex = new BeanRuntimeException(cause, Integer.class, "Value {0} failed", 99);
129 		assertNotNull(ex);
130 		assertSame(cause, ex.getCause());
131 		assertTrue(ex.getMessage().contains("Integer"));
132 		assertTrue(ex.getMessage().contains("99"));
133 	}
134 
135 	@Test
136 	void d03_constructor_withCauseClassAndNullMessage_usesCauseMessage() {
137 		var cause = new RuntimeException("Underlying error");
138 		var ex = new BeanRuntimeException(cause, String.class, null);
139 		assertNotNull(ex);
140 		assertSame(cause, ex.getCause());
141 		assertTrue(ex.getMessage().contains("String"));
142 		assertTrue(ex.getMessage().contains("Underlying error"));
143 	}
144 
145 	@Test
146 	void d04_constructor_withCauseNullClassAndMessage_formatsMessage() {
147 		var cause = new RuntimeException("Underlying error");
148 		var ex = new BeanRuntimeException(cause, null, "Wrapper message");
149 		assertNotNull(ex);
150 		assertSame(cause, ex.getCause());
151 		assertTrue(ex.getMessage().contains("Wrapper message"));
152 		assertFalse(ex.getMessage().contains(": "), "Should not have class prefix when class is null");
153 	}
154 
155 	@Test
156 	void d05_constructor_withNullCauseClassAndMessage_formatsMessage() {
157 		Throwable nullCause = null;
158 		var ex = new BeanRuntimeException(nullCause, String.class, "Test message");
159 		assertNotNull(ex);
160 		assertNull(ex.getCause());
161 		assertTrue(ex.getMessage().contains("String"));
162 		assertTrue(ex.getMessage().contains("Test message"));
163 	}
164 
165 	@Test
166 	void d06_constructor_withNullCauseNullClassAndNullMessage_handlesNulls() {
167 		var ex = new BeanRuntimeException((Class<?>)null, null, (Object)null);
168 		assertNotNull(ex);
169 		assertNull(ex.getCause());
170 		assertNull(ex.getMessage());
171 	}
172 
173 	//====================================================================================================
174 	// Exception chaining and stack traces
175 	//====================================================================================================
176 
177 	@Test
178 	void e01_constructor_preservesStackTrace() {
179 		var cause = new RuntimeException("Original");
180 		var ex = new BeanRuntimeException(cause, String.class, "Wrapped");
181 		assertSame(cause, ex.getCause());
182 		assertNotNull(ex.getStackTrace());
183 		assertTrue(ex.getStackTrace().length > 0);
184 	}
185 
186 	@Test
187 	void e02_constructor_withReflectionException_wrapsCorrectly() {
188 		var cause = new IllegalAccessException("Access denied");
189 		var ex = new BeanRuntimeException(cause, TestClass.class, "Failed to access");
190 		assertSame(cause, ex.getCause());
191 		assertTrue(ex.getMessage().contains("TestClass"));
192 		assertTrue(ex.getMessage().contains("Failed to access"));
193 	}
194 
195 	//====================================================================================================
196 	// Test class for class name formatting
197 	//====================================================================================================
198 
199 	public static class TestClass {
200 		// Test class for exception testing
201 	}
202 }
203