1

@PathParam をコンストラクターに挿入するリソース エンドポイントがあります。つまり、@PathParam 値ごとに異なるインスタンスです。Jetty ではすべて正常に動作します。しかし今、Jersey Test Framework を使用して単体テストを作成しようとしています。テスト フレームワークは、タイプごとに 1 つの登録済みエンドポイントしかサポートしていないようです。

したがって、次のようなことをすると:

@Path("/users")
public class MyResource {

    public MyResource(@PathParam("userId") int userId) {
    }

    @Path("{userId}")
    public String get() {

    }
}

public class MyTest extends JerseyTestNg.ContainerPerClassTest {

    @Override
    protected Application configure() {
        return new ResourceConfig()
                .register(new MyResource(1))
                .register(new MyResource(2));
    }

    @Test
    public void test2() {
        target("/users/1").request().get();
    }

    @Test
    public void test2() {
        target("/users/2").request().get();
    }
}

test1 と test2 の両方が MyResource(1) のインスタンスを呼び出していることがわかります。これは期待されていますか?正しいインスタンスを呼び出す解決策はありますか?

4

1 に答える 1

1

リソースをクラスとして登録する必要があります。ジャージーが作成します。そして、すべての注射を処理します。

「私が投稿した例は馬鹿げています。実際には、私のリソース コンストラクターには、モックする必要がある別の注入されたオブジェクトがあります。では、コンストラクターにモック オブジェクト パラメーターを指定するにはどうすればよいでしょうか?」

次のようなことができます

@Mock
private Service service;

@Override
public ResourceConfig configure() {
    MockitoAnnotations.initMocks(this);
    return new ResourceConfig()
        .register(MyResource.class)
        .register(new AbstractBinder() {
            @Override
            protected configure() {
                bind(service).to(Service.class);
            }
        });
}

@Test
public void test() {
    when(service.getSomething()).thenReturn("Something");
    // test
}

組み込みの HK2 DI を既に使用していて、@Injectリソース クラスのコンストラクターに注釈があると仮定すると、これは機能するはずです。ではAbstractBinder、モック オブジェクトを注入可能にしています。これで、Jersey はそれをリソースに注入できるようになりました。

関連項目:

于 2016-06-17T14:48:51.743 に答える