Restful Webサービスを作成し、JUnit4を使用してテストする必要があります。私はすでにJersey Clientを使用してクライアントを作成しました。しかし、junit4でのみサービスをテストできるかどうかを知りたいです。誰かが少なくともサンプルを手伝ってくれますか?.
残りのサービスには、ユーザー名、パスワードを取得してトークンを返す認証メソッドがあります。
認証方法のテストケースを作成しました。しかし、私はURLを使用してテストする方法がわかりません。
public class TestAuthenticate {
Service service = new Service();
String username = "user";
String password = "password";
String token;
@Test(expected = Exception.class)
public final void testAuthenticateInputs() {
password = "pass";
service.authenticate(username, password);
}
@Test(expected = Exception.class)
public final void testAuthenticateException(){
username = null;
String token = service.authenticate(username, password);
assertNotNull(token);
}
@Test
public final void testAuthenticateResult() {
String token = service.authenticate(username, password);
assertNotNull(token);
}
}
URLを使用してテストする場合は、テストからサーバーを起動する必要があります。組み込みサーバーを明示的に起動できますが、これはテストではかなり一般的です。何かのようなもの
_public class MyResourceTest {
public static final String BASE_URI = "http://localhost:8080/api/";
private HttpServer server;
@Before
public void setUp() throws Exception {
final ResourceConfig rc = new ResourceConfig(Service.class);
server = GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
}
@After
public void tearDown() throws Exception {
server.stop();
}
@Test
public void testService() {
Client client = ClientBuilder.newClient();
WebTarget target = client.target(BASE_URI).path("service");
...
}
}
_
基本的には統合テストです。 Grizzlyコンテナを起動し、ResourceConfig
クラスのみでサーバーにService
をロードしています。もちろん、構成にさらにクラスを追加することもできます。必要に応じて「実際の」リソース設定を使用できます。
上記のテストはこの依存関係を使用します
_<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-http</artifactId>
<version>${jersey2.version}</version>
</dependency>
_
私が好むもう1つのオプションは、 Jersey Test Framework を使用することです。これにより、埋め込みコンテナーが開始されます。テストはもっと似ているかもしれません
_public class SimpleTest extends JerseyTest {
@Override
protected Application configure() {
return new ResourceConfig(Service.class);
}
@Test
public void test() {
String hello = target("service").request().get(String.class);
}
}
_
この依存関係を使用する
_<dependency>
<groupId>org.glassfish.jersey.test-framework.providers</groupId>
<artifactId>jersey-test-framework-provider-grizzly2</artifactId>
<version>${jersey2.version}</version>
<scope>test</scope>
</dependency>
_
そして、埋め込まれたGrizzlyコンテナーは、ResourceConfig
構成で内部で開始されます。上記の両方の例では、テストURLでわかるように、Service
クラスの_@Path
_値はservice
であると想定されています。
いくつかの例
Mavenを使用していない場合は、Jersey Test Fraemworkの埋め込みGrizzlyコンテナーを実行するために必要なjarがあります
私は通常、すべてのjarファイルを検索します here 。バージョンを選択すると、次のページにダウンロードするリンクがあります。検索バーを使用して、他の人を検索できます。
すべてのjarファイルが揃ったら、簡単な実行例を示します
_import com.Sun.jersey.api.client.WebResource;
import com.Sun.jersey.api.core.DefaultResourceConfig;
import com.Sun.jersey.spi.container.servlet.WebComponent;
import com.Sun.jersey.test.framework.JerseyTest;
import com.Sun.jersey.test.framework.WebAppDescriptor;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import junit.framework.Assert;
import org.junit.Test;
public class SimpleTest extends JerseyTest {
@Path("service")
public static class Service {
@GET
public String getTest() { return "Hello World!"; }
}
public static class AppConfig extends DefaultResourceConfig {
public AppConfig() {
super(Service.class);
}
}
@Override
public WebAppDescriptor configure() {
return new WebAppDescriptor.Builder()
.initParam(WebComponent.RESOURCE_CONFIG_CLASS,
AppConfig.class.getName())
.build();
}
@Test
public void doTest() {
WebResource resource = resource().path("service");
String result = resource.get(String.class);
Assert.assertEquals("Hello World!", result);
System.out.println(result);
}
}
_
リソースとResourceConfig
をテストと同じクラスに配置することはほとんどないでしょうが、単純にすべてを1つのクラスに表示したいだけです。
Web.xmlまたはResourceConfig
サブクラス(上記を参照)のいずれを使用している場合でも、テストクラスに組み込まれている別のResourceConfig
を使用して、テスト対象を削減できます。できた。それ以外の場合、通常のResourceConfig
クラスを使用している場合は、configure
メソッドで置き換えることができます。
configure
メソッドは、単にJavaコードでweb.xmlファイルを作成するだけです。 initParam
のような_WebAppDescriptor.Builder
_でさまざまなメソッドを見ることができます。これはWeb xmlの_<init-param>
_と同じです。引数に文字列を単純に使用できますが、上で使用したように、いくつかの定数があります。
_@Test
_は、実行される通常のJUnitテストです。 Jerseyクライアントを使用しています。ただし、Client
を作成する代わりに、Client
を返すresource()
メソッドにアクセスするだけで、事前に構成されたWebResource
を使用できます。 Jerseyクライアントに精通している場合、このクラスは初めてではありません。
@peeskilletは必要な前提条件を与えていると思います。つまり、組み込みWebサーバーでWebサービスを実行する必要があります。また、これを便利に行うためのドロップウィザードまたはスプリングブートのサポートを調べることもできます。
実際に応答を検証するために、私はそれを単純にしてJUnitとhttp-matchersを使います( https://github.com/valid4j/http-matchers を参照)
Alchemy rest client generator をご覧ください。これにより、ジャージークライアントを舞台裏で使用して、JAX-RS Webサービスクラスのプロキシ実装を生成できます。事実上、ユニットサービスから単純なJavaメソッドとしてwebserviceメソッドを呼び出します。http認証も処理します。
簡単にテストを実行する必要がある場合、コード生成は関係ないので便利です。
デモはこちら grizzlyをセットアップし、上記のジェネレーターを使用してjunitテストを実行します。
免責事項:私はこのライブラリの著者です。