(sürüm 2.9.1) kütüphane forması-spring3 ayıklama sonra sorun SpringComponentProvider.createSpringContext yatıyor görünüyor
private ApplicationContext createSpringContext() {
ApplicationHandler applicationHandler = locator.getService(ApplicationHandler.class);
ApplicationContext springContext = (ApplicationContext) applicationHandler.getConfiguration().getProperty(PARAM_SPRING_CONTEXT);
if (springContext == null) {
String contextConfigLocation = (String) applicationHandler.getConfiguration().getProperty(PARAM_CONTEXT_CONFIG_LOCATION);
springContext = createXmlSpringConfiguration(contextConfigLocation);
}
return springContext;
}
Kontrol edildi "contextConfig" adlı bir özellik uygulama özelliklerinde varsa ve değilse, yay uygulama içeriğini başlatır. Testlerinizde bir yay uygulama bağlamı başlatmış olsanız bile, jersey başka bir bağlam oluşturacak ve bunun yerine kullanacaktır. Yani, bir şekilde ApplicationContext'i Jersey Uygulama sınıfındaki testlerimizden geçmek zorundayız.
@ContextConfiguration(locations = "classpath:jersey-spring-applicationContext.xml")
public abstract class JerseySpringTest
{
private JerseyTest _jerseyTest;
public final WebTarget target(final String path)
{
return _jerseyTest.target(path);
}
@Before
public void setup() throws Exception
{
_jerseyTest.setUp();
}
@After
public void tearDown() throws Exception
{
_jerseyTest.tearDown();
}
@Autowired
public void setApplicationContext(final ApplicationContext context)
{
_jerseyTest = new JerseyTest()
{
@Override
protected Application configure()
{
ResourceConfig application = JerseySpringTest.this.configure();
application.property("contextConfig", context);
return application;
}
};
}
protected abstract ResourceConfig configure();
}
yukarıdaki sınıf testlerimizden uygulama bağlamını alıp SpringComponentProvider formanın aynı uygulama bağlamı dönecektir böylece yapılandırılmış ResourceConfig iletecek: Çözüm şudur. Jersey özel yay yapılandırmasını içermek için jersey-spring-applicationContext.xml'i de kullanıyoruz.
Test uygulama içeriği başlatılmadan önce Uygulamayı yapıcıda başlattığı için JerseyTest'ten miras taşıyamayız.
Artık sahte AObject enjekte etmek amacıyla şu tanımı eklemek testContext.xml olarak örnek
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:testContext.xml")
public class SomeTest extends JerseySpringTest
{
@Autowired
private AObject _aObject;
@Test
public void test()
{
// configure mock _aObject when(_aObject.method()).thenReturn() etc...
Response response = target("api/method").request(MediaType.APPLICATION_JSON).get();
Assert.assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
}
@Override
protected ResourceConfig configure()
{
return new ResourceConfig(MyResource.class);
}
}
için testleri oluşturmak için bu temel sınıfını kullanabilirsiniz.
<bean class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.yourcompany.AObject" />
</bean>
Harika cevap! Teşekkürler –
Bu cevap için çok teşekkür ederim, jersey test framework ve spring-test ile entegrasyon testleri geliştirmek için benim sorunları çözer. Özellikle benim problemim, aynı ApplicationContext'te test yürütmesi sırasında sahte nesneleri öğretmekti. Her şey için teşekkürler, – bifulcoluigi