9

この質問は、前の質問Specify Custom Application Contextからの続きです。

データ サービスの一部を、jersey-spring を使用する Jersey 1.x から jersey-spring3 を使用する Jersey 2.x に移行しています。

JerseyTest を継承するいくつかのテスト クラスがあります。これらのクラスの一部は、web.xml ファイルで指定されていないカスタム applicationContext.xml ファイルを使用します。

オブジェクトのモック化の目的で、Jersey リソースのいくつかのコンポーネントをモック化します。

Jersey 1.x では、アプリケーション コンテキスト ファイル内のオブジェクトを次のようにモックすることができました。

<bean id="mockBean" class="org.easymock.EasyMock" 
    factory-method="createStrictMock" autowire="byName">
    <constructor-arg index="0" value="com.xxx.xxx.ClassToMock" /> 
</bean>

これらのモックされたインスタンスを次のように取得します

ClassToMock obj = (ClassToMock)ContextLoader
    .getCurrentWebApplicationContext()
    .getAutowireCapableBeanFactory()
    .getBean("mockBean");

jersey-spring3を使用してJersey 2.xで同じことを達成するにはどうすればよいですか?

API ドキュメントユーザー ガイド、および一部のソースをくまなく調べましたが、答えが見つかりませんでした。

ありがとうございました。

編集:

JAX-RS リソース内でモック Bean を使用します。@Autowiredリソースに組み込まれているサービス インターフェイスがあります。

例えば

@Path(ProductResource.RESOURCE_PATH)
@Component
@Scope("prototype")
public class ProductResource 
extends GenericResource<Product, BaseModel> {

    /*
     * Members
     */

    public static final String RESOURCE_PATH = "product/";

    @Autowired
    protected ProductService productService;

    ...

のモックを作成し、これらのサービスに対する期待を設定します。

例えば

<bean id="productService" class="org.easymock.EasyMock" 
    factory-method="createStrictMock">
    <constructor-arg index="0" 
        value="com.xxx.xxx.service.ProductService" /> 
</bean>
4

4 に答える 4

8

注:私は Spring の専門家ではありません。これは、推奨されるアプローチではなく、回避策であると考えています。うまくいけば、誰かがより良い解決策を考え出すでしょう。

ユニット/e2e テストにJersey Test Framework ( ) を使用する場合、Jersey 2.x ランタイムはデフォルトでサーブレット コンテナの外部で初期化されるためApplicationContext、呼び出してインスタンスを取得することはできません。ContextLoader#getCurrentWebApplicationContext()JerseyTest

この場合、テスト パッケージにApplicationContextAwareApplicationContextインターフェイスを実装することにより、少し回避策を使用して を取得する必要があります。

public class ApplicationContextUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @Override
    public void setApplicationContext(final ApplicationContext applicationContext) throws BeansException {
        ApplicationContextUtils.applicationContext = applicationContext;
    }
}

このクラスを取得したら、アプリケーションのコンテキスト記述子で忘れずに言及してください。

...
<bean class="org.glassfish.jersey.examples.helloworld.spring.ApplicationContextUtils" />
...

そして、あなたのテストでそれを使用することができます:

public class JerseySpringResourceTest extends JerseyTest {

    // ... Configure ...

    @Before
    public void mockUp() throws Exception {
        // ApplicationContext is ready in your @Before methods ...
        assertThat(ApplicationContextUtils.getApplicationContext(), notNullValue());
    }

    @Test
    public void testJerseyResource() {
        // ... as well as in your test methods.
        assertThat(ApplicationContextUtils.getApplicationContext(), notNullValue());
    }
}

注:アプリケーションをサーブレット コンテナーにデプロイし、JerseyTestそれに対して ( ) テストを実行する場合は、ユーザー ガイドのジャージー テスト フレームワークの章 (特に外部コンテナーのセクション) を参照してください。

于 2013-08-17T13:27:38.550 に答える
3

異議がない場合は、テスト クラスを Jersey コンテキストに注入できます。

例えば:

@Override
protected Application configure() {
    final TestJerseyApplication application = new TestJerseyApplication();

    final Map<String, Object> properties = new HashMap<>();
    properties.put("contextConfigLocation", "classpath:test-spring-context.xml");
    application.setProperties(properties);

    application.register(this);
    return application;
}

その後、@Autowired注釈が機能します。

于 2015-06-02T15:04:12.580 に答える
1

Jersey バージョン 2.4.x では、このクラスは存在せず、contextConfigプロパティを認識しないクラスJerseyConfigurationに置き換えられました。ここに私の解決策があります:ResourceConfig

package ch.vd.test;

import java.net.URI;

import javax.ws.rs.core.Application;

import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.jersey.server.ApplicationHandler;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.glassfish.jersey.test.grizzly.GrizzlyTestContainerFactory;
import org.glassfish.jersey.test.spi.TestContainer;
import org.glassfish.jersey.test.spi.TestContainerException;
import org.glassfish.jersey.test.spi.TestContainerFactory;
import org.junit.Test;
import org.springframework.context.ApplicationContext;

public class ExampleTest extends JerseyTest {

    private ServiceLocator serviceLocator;

    @Override
    public void setUp() throws Exception {
        super.setUp();
        final ApplicationContext context = serviceLocator.getService(ApplicationContext.class, "SpringContext");
        final Object bean = context.getBean("someBean");
    }

    @Override
    protected Application configure() {
        final ResourceConfig config = new ResourceConfig(RestResources.class);
        config.property("contextConfigLocation", "classpath:example-context.xml");
        return config;
    }

    @Override
    protected TestContainerFactory getTestContainerFactory() throws TestContainerException {
        return new GrizzlyTestContainerFactory() {
            @Override
            public TestContainer create(URI uri, ApplicationHandler appHandler) throws IllegalArgumentException {
                serviceLocator = appHandler.getServiceLocator();
                return super.create(uri, appHandler);
            }
        };
    }

    @Test
    public void testStuff() throws Exception {
        ...
    }
}
于 2014-06-26T06:13:33.983 に答える
1

Jersey 2.X ユーザーの場合は、次のように機能しました。

  public class AccountResourceTest extends JerseyTest {

    private ApplicationContext context;

    private BeanA beanA;

    private BeanB beanB;

    public AccountResourceTest() throws TestContainerException {
        super();

        beanA = context.getBean(BeanA.class);
        beanB = context.getBean(BeanB.class);
    }

    @Override
    protected Application configure() {
        context = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        final ResourceConfig config = new JerseyConfiguration().property("contextConfig", context);
        return config;
    }

    @Override
    protected void configureClient(final ClientConfig config) {
        config.register(JacksonJsonProvider.class);
    }

    ...
}

これにより、Jersey テストに JavaConfig を使用し、コンテキスト内の Bean にもアクセスできるようになります。私がアイデアを得た場所へのリンクは次のとおりです

于 2014-03-15T21:48:33.020 に答える