我正在尝试为继承的基于Spring
的项目配置单元测试。我尝试了一些东西,但基本上我试图将@Autowired
的东西塞进我的测试用例中。这里是我的设置:“简单”弹簧单元测试
控制器类,看起来像这样:
@Controller("serverService")
@RequestMapping("/rest/server")
@Api(value = "server")
public class ServerServiceImpl extends AbstractServiceImpl implements ServerService {
@Override
@RequestMapping(value = "/getTime", method = RequestMethod.GET)
public @ResponseBody
GatewayResponse<TimeData> getTime() {...}
ServerService
仅仅是能够互操作与GWT
的接口。我现在不太担心GWT
的单元测试。
AbstractServiceImpl
的主要目的是包装一个基于SOAP
的Web服务,该服务器本质上是代理服务器,使移动友好。网络服务由Apache CXF
自动生成。 AbstractServiceImpl
如下(大约):
public class AbstractServiceImpl {
@Autowired
private WebServices webServices;
public WebServices getWebServices() {
return webServices;
}
在我的测试类,我有:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:**/applicationContext.xml", "classpath:**/applicationContext-Services.xml"})
@WebAppConfiguration
public class LoginTest {
@Autowired
private ServerServiceImpl svc;
public LoginTest() {
}
@Test
public void validate() {
assertNotNull(svc);
}
}
我在努力与模拟JSON和这样的模拟电话到我的web服务没有兴趣。我只想编写单元测试,创建未嘲笑的ServerServiceImpl
与未嘲笑的WebServices
对象并调用实时服务器。
我的测试目前失败,因为@Autowired
无法创建ServerServiceImpl
。我也尝试重构我的代码,使用@Autowired
作为WebServices
,并使用它传递给构造函数ServerServiceImpl
,但这也由于@Autowired
而失败。
是applicationContext.xml的文本中的类路径或只是你活的? – tom 2014-10-27 23:50:36
我只有一个applicationContext.xml,所以我认为这必须是活的......除非有些魔法/弹簧魔法以某种方式创建另一个。 – Tim 2014-10-27 23:51:33
要单元测试这些,请使用构造函数注入和一个模拟库(如Mockito)。这可以让你完全避免使用Spring,并且在没有外部依赖的情况下单独测试这个类。 – chrylis 2014-10-28 00:08:37