Commit 37a4099c9cbb0d78b58404f7e16297a443b7d0b5

Authored by Wilson Guimarães
1 parent dff9ad80
Exists in master

Mantis 0000752: Correção da exceção retornada pelo interceptador de

ExceptionHandler
impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/interceptor/ExceptionHandlerInterceptor.java
@@ -171,12 +171,17 @@ public class ExceptionHandlerInterceptor implements Serializable { @@ -171,12 +171,17 @@ public class ExceptionHandlerInterceptor implements Serializable {
171 try { 171 try {
172 method.invoke(object, param); 172 method.invoke(object, param);
173 } catch (InvocationTargetException cause) { 173 } catch (InvocationTargetException cause) {
174 - throw new DemoiselleException(cause.getTargetException()); 174 + Throwable targetTrowable = cause.getTargetException();
  175 + if (targetTrowable instanceof Exception) {
  176 + throw (Exception) targetTrowable;
  177 + } else {
  178 + throw new Exception(targetTrowable);
  179 + }
175 } 180 }
176 181
177 method.setAccessible(accessible); 182 method.setAccessible(accessible);
178 } 183 }
179 - 184 +
180 @AroundInvoke 185 @AroundInvoke
181 public Object manage(final InvocationContext ic) throws Exception { 186 public Object manage(final InvocationContext ic) throws Exception {
182 Object result = null; 187 Object result = null;
impl/core/src/test/java/br/gov/frameworkdemoiselle/internal/interceptor/ExceptionHandlerInterceptorTest.java
@@ -75,11 +75,11 @@ public class ExceptionHandlerInterceptorTest { @@ -75,11 +75,11 @@ public class ExceptionHandlerInterceptorTest {
75 75
76 private ResourceBundle bundle; 76 private ResourceBundle bundle;
77 77
78 - class TesteException extends DemoiselleException { 78 + class TestException extends DemoiselleException {
79 79
80 private static final long serialVersionUID = 1L; 80 private static final long serialVersionUID = 1L;
81 81
82 - public TesteException(String message) { 82 + public TestException(String message) {
83 super(message); 83 super(message);
84 } 84 }
85 } 85 }
@@ -97,7 +97,7 @@ public class ExceptionHandlerInterceptorTest { @@ -97,7 +97,7 @@ public class ExceptionHandlerInterceptorTest {
97 public void methodWithExceptionHandlerAnotationAndGenericException(Exception cause) { 97 public void methodWithExceptionHandlerAnotationAndGenericException(Exception cause) {
98 times++; 98 times++;
99 } 99 }
100 - 100 +
101 } 101 }
102 102
103 class ClassWithoutMethodsAnnotatedWithExceptionHandler { 103 class ClassWithoutMethodsAnnotatedWithExceptionHandler {
@@ -116,7 +116,7 @@ public class ExceptionHandlerInterceptorTest { @@ -116,7 +116,7 @@ public class ExceptionHandlerInterceptorTest {
116 throw new RuntimeException(); 116 throw new RuntimeException();
117 } 117 }
118 } 118 }
119 - 119 +
120 class ClassWithMethodWithoutParameterAnnotatedWithExceptionHandler { 120 class ClassWithMethodWithoutParameterAnnotatedWithExceptionHandler {
121 121
122 @ExceptionHandler 122 @ExceptionHandler
@@ -125,6 +125,18 @@ public class ExceptionHandlerInterceptorTest { @@ -125,6 +125,18 @@ public class ExceptionHandlerInterceptorTest {
125 125
126 } 126 }
127 127
  128 + class ClassWithExceptionHandlerMethodThatRethrowException {
  129 +
  130 + int times = 0;
  131 +
  132 + @ExceptionHandler
  133 + public void methodThatRethrowException(TestException cause) {
  134 + times++;
  135 + throw cause;
  136 + }
  137 +
  138 + }
  139 +
128 @Before 140 @Before
129 public void setUp() throws Exception { 141 public void setUp() throws Exception {
130 this.logger = PowerMock.createMock(Logger.class); 142 this.logger = PowerMock.createMock(Logger.class);
@@ -138,7 +150,7 @@ public class ExceptionHandlerInterceptorTest { @@ -138,7 +150,7 @@ public class ExceptionHandlerInterceptorTest {
138 } 150 }
139 151
140 @Test 152 @Test
141 - public void testManageSucessyfull() throws Throwable { 153 + public void manageSuccessfully() throws Throwable {
142 expect(this.context.proceed()).andReturn(null); 154 expect(this.context.proceed()).andReturn(null);
143 replay(); 155 replay();
144 assertEquals(null, this.interceptor.manage(this.context)); 156 assertEquals(null, this.interceptor.manage(this.context));
@@ -146,7 +158,7 @@ public class ExceptionHandlerInterceptorTest { @@ -146,7 +158,7 @@ public class ExceptionHandlerInterceptorTest {
146 } 158 }
147 159
148 @Test 160 @Test
149 - public void testManageWithClassThatDoNotContainMethodAnnotatedWithHandleException() throws Throwable { 161 + public void manageWithClassThatDoesNotContainHandleMethod() throws Exception {
150 ClassWithoutMethodsAnnotatedWithExceptionHandler classWithoutException = new ClassWithoutMethodsAnnotatedWithExceptionHandler(); 162 ClassWithoutMethodsAnnotatedWithExceptionHandler classWithoutException = new ClassWithoutMethodsAnnotatedWithExceptionHandler();
151 expect(this.context.getTarget()).andReturn(classWithoutException); 163 expect(this.context.getTarget()).andReturn(classWithoutException);
152 expect(this.context.proceed()).andThrow(new DemoiselleException("")); 164 expect(this.context.proceed()).andThrow(new DemoiselleException(""));
@@ -164,7 +176,7 @@ public class ExceptionHandlerInterceptorTest { @@ -164,7 +176,7 @@ public class ExceptionHandlerInterceptorTest {
164 } 176 }
165 177
166 @Test 178 @Test
167 - public void testManageWithClassThatContainMethodAnnotatedWithHandleException() throws Throwable { 179 + public void manageWithClassThatContainsHandleMethod() throws Exception {
168 ClassWithMethodsAnnotatedWithExceptionHandler classWithException = new ClassWithMethodsAnnotatedWithExceptionHandler(); 180 ClassWithMethodsAnnotatedWithExceptionHandler classWithException = new ClassWithMethodsAnnotatedWithExceptionHandler();
169 expect(this.context.getTarget()).andReturn(classWithException).anyTimes(); 181 expect(this.context.getTarget()).andReturn(classWithException).anyTimes();
170 expect(this.context.proceed()).andThrow(new DemoiselleException("")); 182 expect(this.context.proceed()).andThrow(new DemoiselleException(""));
@@ -177,8 +189,7 @@ public class ExceptionHandlerInterceptorTest { @@ -177,8 +189,7 @@ public class ExceptionHandlerInterceptorTest {
177 } 189 }
178 190
179 @Test 191 @Test
180 - public void testManageWithClassThatContainTwoMethodsAnnotatedWithHandleExceptionButOnlyOneIsCalled()  
181 - throws Throwable { 192 + public void manageWithClassThatContainsParentExceptionHandleMethod() throws Exception {
182 ClassWithMethodsAnnotatedWithExceptionHandler classWithException = new ClassWithMethodsAnnotatedWithExceptionHandler(); 193 ClassWithMethodsAnnotatedWithExceptionHandler classWithException = new ClassWithMethodsAnnotatedWithExceptionHandler();
183 expect(this.context.getTarget()).andReturn(classWithException).anyTimes(); 194 expect(this.context.getTarget()).andReturn(classWithException).anyTimes();
184 expect(this.context.proceed()).andThrow(new DemoiselleException("")); 195 expect(this.context.proceed()).andThrow(new DemoiselleException(""));
@@ -191,44 +202,26 @@ public class ExceptionHandlerInterceptorTest { @@ -191,44 +202,26 @@ public class ExceptionHandlerInterceptorTest {
191 } 202 }
192 203
193 @Test 204 @Test
194 - public void testManageWithClassThatContainMethodAnnotatedWithHandleParentException() throws Throwable { 205 + public void manageWithClassThatContainsHandleMethodWithDiferentException() throws Exception {
195 ClassWithMethodsAnnotatedWithExceptionHandler classWithException = new ClassWithMethodsAnnotatedWithExceptionHandler(); 206 ClassWithMethodsAnnotatedWithExceptionHandler classWithException = new ClassWithMethodsAnnotatedWithExceptionHandler();
196 expect(this.context.getTarget()).andReturn(classWithException).anyTimes(); 207 expect(this.context.getTarget()).andReturn(classWithException).anyTimes();
197 - expect(this.context.proceed()).andThrow(new DemoiselleException("")); 208 + expect(this.context.proceed()).andThrow(new TestException(""));
  209 + replay(this.context);
198 expect(CoreBootstrap.isAnnotatedType(ClassWithMethodsAnnotatedWithExceptionHandler.class)).andReturn(true); 210 expect(CoreBootstrap.isAnnotatedType(ClassWithMethodsAnnotatedWithExceptionHandler.class)).andReturn(true);
199 replayAll(this.context, CoreBootstrap.class); 211 replayAll(this.context, CoreBootstrap.class);
200 212
201 - assertNull(this.interceptor.manage(this.context));  
202 - assertEquals(1, classWithException.times);  
203 - verifyAll();  
204 - }  
205 -  
206 - @Test  
207 - public void testManageWithClassThatContainMethodAnnotatedWithHandleExceptionButCauseIsDiferent() throws Throwable {  
208 - ClassWithMethodsAnnotatedWithExceptionHandler classWithException = new ClassWithMethodsAnnotatedWithExceptionHandler();  
209 - expect(this.context.getTarget()).andReturn(classWithException).anyTimes();  
210 - expect(this.context.proceed()).andThrow(new TesteException(""));  
211 - replay(this.context);  
212 - this.logger = PowerMock.createMock(Logger.class);  
213 - this.logger.info(EasyMock.anyObject(String.class));  
214 - this.logger.debug(EasyMock.anyObject(String.class));  
215 - replay(this.logger);  
216 -  
217 - this.interceptor = new ExceptionHandlerInterceptor(this.logger, this.bundle);  
218 -  
219 try { 213 try {
220 this.interceptor.manage(this.context); 214 this.interceptor.manage(this.context);
221 fail(); 215 fail();
222 - } catch (TesteException e) {  
223 - assertTrue(true); 216 + } catch (TestException e) {
224 assertEquals(0, classWithException.times); 217 assertEquals(0, classWithException.times);
225 } 218 }
  219 +
226 verify(); 220 verify();
227 } 221 }
228 222
229 @Test 223 @Test
230 - public void testManageWithClassThatContainMethodAnnotatedWithHandleExceptionButMethodCouldNotBeCalled()  
231 - throws Throwable { 224 + public void manageWithClassThatContainsHandleMethodThatThrowsAnotherException() throws Exception {
232 ClassWithMethodsAnnotatedWithExceptionHandlerAndThrowException classWithException = new ClassWithMethodsAnnotatedWithExceptionHandlerAndThrowException(); 225 ClassWithMethodsAnnotatedWithExceptionHandlerAndThrowException classWithException = new ClassWithMethodsAnnotatedWithExceptionHandlerAndThrowException();
233 expect(this.context.getTarget()).andReturn(classWithException).anyTimes(); 226 expect(this.context.getTarget()).andReturn(classWithException).anyTimes();
234 expect(this.context.proceed()).andThrow(new DemoiselleException("")); 227 expect(this.context.proceed()).andThrow(new DemoiselleException(""));
@@ -239,25 +232,25 @@ public class ExceptionHandlerInterceptorTest { @@ -239,25 +232,25 @@ public class ExceptionHandlerInterceptorTest {
239 try { 232 try {
240 this.interceptor.manage(this.context); 233 this.interceptor.manage(this.context);
241 fail(); 234 fail();
242 - } catch (Exception e) { 235 + } catch (RuntimeException e) {
243 assertEquals(1, classWithException.times); 236 assertEquals(1, classWithException.times);
244 - assertTrue(true);  
245 } 237 }
246 238
247 verifyAll(); 239 verifyAll();
248 } 240 }
249 - 241 +
250 @Test 242 @Test
251 - public void testManageWithClassThatContainMethodsAnnotatedWithHandleExceptionAndIsInvokedTwice() throws Throwable { 243 + public void manageWithClassThatContainsHandleMethodsAndIsInvokedTwice() throws Exception {
252 ClassWithMethodsAnnotatedWithExceptionHandler classWithException = new ClassWithMethodsAnnotatedWithExceptionHandler(); 244 ClassWithMethodsAnnotatedWithExceptionHandler classWithException = new ClassWithMethodsAnnotatedWithExceptionHandler();
253 expect(this.context.getTarget()).andReturn(classWithException).anyTimes(); 245 expect(this.context.getTarget()).andReturn(classWithException).anyTimes();
254 expect(this.context.proceed()).andThrow(new DemoiselleException("")); 246 expect(this.context.proceed()).andThrow(new DemoiselleException(""));
255 - expect(CoreBootstrap.isAnnotatedType(ClassWithMethodsAnnotatedWithExceptionHandler.class)).andReturn(true).anyTimes(); 247 + expect(CoreBootstrap.isAnnotatedType(ClassWithMethodsAnnotatedWithExceptionHandler.class)).andReturn(true)
  248 + .anyTimes();
256 replayAll(this.context, CoreBootstrap.class); 249 replayAll(this.context, CoreBootstrap.class);
257 250
258 assertNull(this.interceptor.manage(this.context)); 251 assertNull(this.interceptor.manage(this.context));
259 assertEquals(1, classWithException.times); 252 assertEquals(1, classWithException.times);
260 - 253 +
261 this.context = PowerMock.createMock(InvocationContext.class); 254 this.context = PowerMock.createMock(InvocationContext.class);
262 expect(this.context.getTarget()).andReturn(classWithException).anyTimes(); 255 expect(this.context.getTarget()).andReturn(classWithException).anyTimes();
263 expect(this.context.proceed()).andThrow(new Exception("")); 256 expect(this.context.proceed()).andThrow(new Exception(""));
@@ -266,15 +259,16 @@ public class ExceptionHandlerInterceptorTest { @@ -266,15 +259,16 @@ public class ExceptionHandlerInterceptorTest {
266 assertNull(this.interceptor.manage(this.context)); 259 assertNull(this.interceptor.manage(this.context));
267 assertEquals(2, classWithException.times); 260 assertEquals(2, classWithException.times);
268 verifyAll(); 261 verifyAll();
269 - 262 +
270 } 263 }
271 - 264 +
272 @Test 265 @Test
273 - public void testManageWithClassThatContainMethodAnnotatedWithHandleExceptionWithoutParameter() throws Throwable { 266 + public void manageWithClassThatContainsHandleMethodWithoutParameter() throws Exception {
274 ClassWithMethodWithoutParameterAnnotatedWithExceptionHandler classWithException = new ClassWithMethodWithoutParameterAnnotatedWithExceptionHandler(); 267 ClassWithMethodWithoutParameterAnnotatedWithExceptionHandler classWithException = new ClassWithMethodWithoutParameterAnnotatedWithExceptionHandler();
275 expect(this.context.getTarget()).andReturn(classWithException).anyTimes(); 268 expect(this.context.getTarget()).andReturn(classWithException).anyTimes();
276 expect(this.context.proceed()).andThrow(new DemoiselleException("")); 269 expect(this.context.proceed()).andThrow(new DemoiselleException(""));
277 - expect(CoreBootstrap.isAnnotatedType(ClassWithMethodWithoutParameterAnnotatedWithExceptionHandler.class)).andReturn(true); 270 + expect(CoreBootstrap.isAnnotatedType(ClassWithMethodWithoutParameterAnnotatedWithExceptionHandler.class))
  271 + .andReturn(true);
278 replayAll(this.context, CoreBootstrap.class); 272 replayAll(this.context, CoreBootstrap.class);
279 273
280 try { 274 try {
@@ -283,8 +277,58 @@ public class ExceptionHandlerInterceptorTest { @@ -283,8 +277,58 @@ public class ExceptionHandlerInterceptorTest {
283 } catch (DemoiselleException e) { 277 } catch (DemoiselleException e) {
284 assertTrue(true); 278 assertTrue(true);
285 } 279 }
286 - 280 +
  281 + verifyAll();
  282 + }
  283 +
  284 + @Test
  285 + public void manageHandlerMethodThatRethrowExpectedException() throws Exception {
  286 + ClassWithExceptionHandlerMethodThatRethrowException testClass = new ClassWithExceptionHandlerMethodThatRethrowException();
  287 + expect(this.context.getTarget()).andReturn(testClass).anyTimes();
  288 + expect(this.context.proceed()).andThrow(new TestException(""));
  289 + expect(CoreBootstrap.isAnnotatedType(ClassWithExceptionHandlerMethodThatRethrowException.class))
  290 + .andReturn(true);
  291 + replayAll(this.context, CoreBootstrap.class);
  292 +
  293 + try {
  294 + this.interceptor.manage(this.context);
  295 + fail();
  296 + } catch (TestException e) {
  297 + assertEquals(1, testClass.times);
  298 + }
  299 +
287 verifyAll(); 300 verifyAll();
288 } 301 }
289 302
  303 + /**
  304 + * Tests an exception handler when the class that contains the method is a proxy. This is the case when using
  305 + * injection.
  306 + *
  307 + * @throws Exception
  308 + */
  309 + @Test
  310 + public void manageHandlerMethodInsideProxyClass() throws Exception {
  311 + // creates a proxy class
  312 + ClassWithExceptionHandlerMethodThatRethrowException testClass = PowerMock
  313 + .createNicePartialMockForAllMethodsExcept(ClassWithExceptionHandlerMethodThatRethrowException.class,
  314 + "methodThatRethrowException");
  315 + expect(this.context.getTarget()).andReturn(testClass).anyTimes();
  316 + expect(this.context.proceed()).andThrow(new TestException(""));
  317 + expect(CoreBootstrap.isAnnotatedType(testClass.getClass())).andReturn(false);
  318 +
  319 + this.logger = PowerMock.createMock(Logger.class);
  320 + this.logger.info(EasyMock.anyObject(String.class));
  321 + this.logger.debug(EasyMock.anyObject(String.class));
  322 + replayAll(testClass, this.context, CoreBootstrap.class, logger);
  323 +
  324 + this.interceptor = new ExceptionHandlerInterceptor(this.logger, this.bundle);
  325 +
  326 + try {
  327 + this.interceptor.manage(this.context);
  328 + fail();
  329 + } catch (TestException e) {
  330 + assertEquals(1, testClass.times);
  331 + }
  332 + }
  333 +
290 } 334 }