使用RMI(遠程方法調用)時,對於在Remote
的接口中定義的所有方法在其throws
子句中包含RemoteException
都是必需的。測試遠程接口的所有方法是否拋出RemoteException
例如,請參閱以下Computing
接口this RMI tutorial。
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
接口被聲明,但不Ť hrow RemoteException
,因此它不能被導出。但是,如果在測試之前添加@Ignore
,則Maven構建會成功結束,這意味着未對條件進行測試。
我看到一個解決方案來編寫一個自定義測試,它將查看每個Remote
接口,並使用反射來檢查每個方法是否拋出RemoteException
。但我相信有一個更好的方法。
我使用Maven構建項目,所以我在附件列表中添加了'rmic-maven-plugin'。但是編譯過程中還沒有測試這個條件。是否有任何特定的事情要做,以強制檢測條件? – jjurm
默認情況下是這樣。你確定它正在執行嗎?你有'遠程'接口應該失敗?注意你在遠程對象上運行它,而不是在接口上運行它。 – EJP
關鍵是我想測試接口。遠程對象不需要拋出'RemoteException'。我不認爲在我的配置中,除了我的任何測試正在執行。我添加了一個代碼來演示這個問題。 – jjurm