【问题标题】:Test if all methods of a Remote interface throw RemoteException测试Remote接口的所有方法是否都抛出RemoteException
【发布时间】:2016-12-11 15:43:21
【问题描述】:

使用 RMI(远程方法调用)时,在扩展 Remote 的接口中定义的所有方法都需要在其 throws 子句中包含 RemoteException

例如,从this RMI tutorial看下面的Computing接口。

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

问题是编译器不检查方法是否定义正确,而是在执行过程中当程序遇到Remote接口中的方法不抛出RemoteException时抛出异常。

如果在程序实际运行之前发现这些问题会更好。如何为这种情况编写测试?


编辑:我添加了一个示例代码来演示这个问题。

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 失败,因为RemoteExample.action() 方法在Remote 接口中声明但没有抛出RemoteException,因此无法导出。但是,如果在测试前加上@Ignore,maven build 会成功结束,这意味着条件没有经过测试。

我看到了一种编写自定义测试的解决方案,该测试将查看每个Remote 接口,并使用反射检查每个方法是否抛出RemoteException。但我相信有更好的方法。

【问题讨论】:

    标签: java reflection junit rmi remoteexception


    【解决方案1】:

    rmic 检查它。您可以将 rmic 合并到您的构建中。如果您想使用动态存根,请务必在之后删除 _stub.class 文件。

    【讨论】:

    • 我使用 Maven 构建项目,所以我在依赖列表中添加了rmic-maven-plugin。但是在编译过程中仍然没有测试条件。为了强制rmic 测试条件,有什么具体要做的吗?
    • 默认情况下会这样做。你确定它正在执行?并且您有 Remote 应该失败的接口?注意你在远程对象上运行它,而不是接口。
    • 重点是我要测试接口。远程对象不需要抛出RemoteException。我认为在我的配置中,除了我的之外没有任何测试正在执行。我添加了一个代码来演示这个问题。
    • 重点是rmic 已经对其进行了测试,正如我已经说过的。我知道您在远程对象上运行它,但是如果它实现的远程接口具有不抛出 RemoteException 的方法,它会抱怨。你不需要做任何进一步的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 2016-04-30
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多