При работе с 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
, используя отражение. Но я считаю, что есть лучший подход.
Я использую Maven для создания проекта, поэтому я добавил 'rmic-maven-plugin' в список зависимостей. Но во время компиляции это условие еще не проверено. Есть ли что-то конкретное, чтобы заставить «rmic» проверить условие? – jjurm
Он делает это по умолчанию. Вы уверены, что это выполняется? и что у вас есть интерфейсы «Remote», которые должны завершиться неудачей? NB вы запускаете его на удаленных объектах, а не на интерфейсах. – EJP
Дело в том, что я хочу протестировать интерфейсы. Удаленным объектам не нужно бросать «RemoteException». Я не думаю, что в моей конфигурации все тесты, кроме моих, выполняются. Я добавил код, чтобы продемонстрировать проблему. – jjurm