Skip to content

Conversation

@motlin
Copy link
Contributor

@motlin motlin commented Jan 28, 2026

What's changed?

The ExpectedExceptionToAssertThrows recipe now preserves the throws clause when statements before the thrown.expect() call throw checked exceptions.

Previously, the recipe unconditionally removed the throws clause from test methods when converting ExpectedException to assertThrows(). This caused compilation errors when code outside the assertThrows() lambda still threw checked exceptions.

Key changes:

  • Added findPredecessorStatements() to track statements before the first expect*() call
  • Added statementsBeforeExpectThrowCheckedException() to detect if those statements throw checked exceptions
  • Added isCheckedException() to distinguish checked exceptions from RuntimeException/Error
  • Modified visitMethodDeclaration() to preserve throws when pre-expect code throws checked exceptions

What's your motivation?

When migrating tests that have setup code before thrown.expect(), the recipe was incorrectly removing the throws declaration, causing compilation failures.

Example:

@Test
public void testMethod() throws InterruptedException {
    setup();  // throws InterruptedException - NOT wrapped in assertThrows
    this.thrown.expect(IllegalArgumentException.class);
    doSomething();
}

The recipe was removing throws InterruptedException even though setup() is not wrapped in the assertThrows() lambda.

Anything in particular you'd like reviewers to focus on?

The logic for detecting checked exceptions in statementThrowsCheckedException() - it recursively visits method invocations and constructor calls to check their thrown exception types. Please verify this covers all cases.

Anyone you would like to review specifically?

Have you considered any alternatives or workarounds?

Any additional context

The fix uses JavaType.Method.getThrownExceptions() to inspect method types, which requires proper type attribution. This should work in typical recipe execution contexts.

Checklist

  • I've added unit tests to cover both positive and negative cases
  • I've read and applied the recipe conventions and best practices
  • I've used the IntelliJ IDEA auto-formatter on affected files

@github-project-automation github-project-automation bot moved this to In Progress in OpenRewrite Jan 28, 2026
@timtebeek timtebeek self-requested a review January 29, 2026 00:54
@motlin motlin force-pushed the expected-exception-preserve-throws branch 2 times, most recently from 1c1b329 to fd06b9c Compare January 30, 2026 13:45
@motlin motlin force-pushed the expected-exception-preserve-throws branch from fd06b9c to e63c8f1 Compare February 3, 2026 14:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

1 participant