2016-12-11 41 views
0

使用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。但我相信有一個更好的方法。

回答

0

rmic檢查它。你可以將rmic合併到你的版本中。如果要使用動態存根,請務必在之後刪除_stub.class文件。

+0

我使用Maven構建項目,所以我在附件列表中添加了'rmic-maven-plugin'。但是編譯過程中還沒有測試這個條件。是否有任何特定的事情要做,以強制檢測條件? – jjurm

+0

默認情況下是這樣。你確定它正在執行嗎?你有'遠程'接口應該失敗?注意你在遠程對象上運行它,而不是在接口上運行它。 – EJP

+0

關鍵是我想測試接口。遠程對象不需要拋出'RemoteException'。我不認爲在我的配置中,除了我的任何測試正在執行。我添加了一個代碼來演示這個問題。 – jjurm

相關問題