調試球衣,spring3(2.9.1版本)庫後,似乎問題出在SpringComponentProvider.createSpringContext
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;
}
它檢查是否一個名爲「contextConfig」屬性的應用程序屬性存在,如果不是,它會初始化Spring應用程序上下文。 即使您在測試中初始化了Spring應用程序上下文,澤西島也會創建另一個上下文並使用該上下文。所以我們必須以某種方式從Jersey Application類的測試中傳遞ApplicationContext。該解決方案是:
@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();
}
上面的類會從我們的測試應用程序上下文,並把它傳遞給配置ResourceConfig,使SpringComponentProvider將同一應用程序上下文返回球衣。我們還使用jersey-spring-applicationContext.xml來包含球衣特定的彈簧配置。
我們不能從JerseyTest繼承,因爲它初始化在測試應用程序上下文之前構造函數初始化應用程序。
現在你可以使用這個基類例如
@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);
}
}
創建你的測試在testContext.xml加上以下定義以注入模擬AObject。
<bean class="org.mockito.Mockito" factory-method="mock">
<constructor-arg value="com.yourcompany.AObject" />
</bean>
偉大的答案!謝謝 –
非常感謝這個答案,它解決了我用球衣測試框架和彈簧測試開發集成測試的問題。特別是我的問題是在同一個ApplicationContext中的測試執行期間指示模擬對象。感謝所有人, – bifulcoluigi