2016-12-11 6 views
0

При работе с RMI (вызов удаленного метода) это требуется для всех методов, определенных в интерфейсах, простирающихся Remote, чтобы содержать RemoteException в своем предложении throws.Проверить, удалены ли все методы удаленного интерфейса RemoteException

Например, см. Следующий интерфейс Computing от this RMI tutorial.

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

Проблема заключается в том, что компилятор не проверяет, если методы определены правильно, а не исключение создается во время выполнения, когда программа встречает метод в интерфейсе Remote, который не бросает RemoteException.

Было бы намного лучше, если бы такие проблемы были обнаружены до того, как программа будет запущена. Как можно написать тест для этого условия?


EDIT: Я добавил образец кода, чтобы продемонстрировать эту проблему.

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 build завершится успешно, что означает, что условие не было проверено.

Я вижу решение для написания пользовательского теста, который будет смотреть на каждый интерфейс Remote и будет проверять, будет ли каждый метод вызывать RemoteException, используя отражение. Но я считаю, что есть лучший подход.

ответ

0

rmic проверяет его. Вы можете включить rmic в свою сборку. Обязательно удалите файлы _stub.class, если вы хотите использовать динамические заглушки.

+0

Я использую Maven для создания проекта, поэтому я добавил 'rmic-maven-plugin' в список зависимостей. Но во время компиляции это условие еще не проверено. Есть ли что-то конкретное, чтобы заставить «rmic» проверить условие? – jjurm

+0

Он делает это по умолчанию. Вы уверены, что это выполняется? и что у вас есть интерфейсы «Remote», которые должны завершиться неудачей? NB вы запускаете его на удаленных объектах, а не на интерфейсах. – EJP

+0

Дело в том, что я хочу протестировать интерфейсы. Удаленным объектам не нужно бросать «RemoteException». Я не думаю, что в моей конфигурации все тесты, кроме моих, выполняются. Я добавил код, чтобы продемонстрировать проблему. – jjurm

 Смежные вопросы

  • Нет связанных вопросов^_^