jjurm
jjurm

Reputation: 499

Test if all methods of a Remote interface throw RemoteException

When working with RMI (Remote Method Invocation), it is required for all methods defined in interfaces extending Remote to contain RemoteException in their throws clause.

For example, see the following Computing interface from this RMI tutorial.

public interface Compute extends Remote {
    <T> T executeTask(Task<T> t) throws RemoteException;
}

The problem is that the compiler does not check if the methods are defined correctly, instead an exception is thrown during the execution when the program encounters a method in a Remote interface that does not throw RemoteException.

It would be much better if such problems were discovered before the program is actually run. How can one write a test for that condition?


EDIT: I added a sample code to demonstrate the problem.

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>test</groupId>
  <artifactId>test</artifactId>
  <version>0.0.1-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>rmic-maven-plugin</artifactId>
      <version>1.2.1</version>
    </dependency>
  </dependencies>
</project>

src/main/java/test/RemoteExample.java

package test;
import java.rmi.Remote;
public interface RemoteExample extends Remote {
  // the method does not throw RemoteException
  void action();
}

src/test/java/test/RemoteExampleTest.java

package test;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import org.junit.Test;

public class RemoteExampleTest {
  @Test
  public void test1() throws RemoteException {
    RemoteExample example = new RemoteExample() {
      public void action() {
        // do nothing
      }
    };
    // this fails
    RemoteExample exported = (RemoteExample) UnicastRemoteObject.exportObject(example, 0);
  }
}

mvn test fails, because the method RemoteExample.action() is declared in a Remote interface but does not throw RemoteException, therefore it can't be exported. However, if you add @Ignore before the test, maven build ends successfully, which implies that the condition was not tested.

I see a solution to write a custom test that would look at each Remote interface and would check if every method throws RemoteException, using reflection. But I believe there is a better approach.

Upvotes: 1

Views: 1667

Answers (1)

user207421
user207421

Reputation: 310916

rmic checks it. You could incorporate rmic into your build. Make sure to delete the _stub.class files afterwards if you want to use dynamic stubs.

Upvotes: 0

Related Questions