2014-10-27 150 views
0

我正在尝试为继承的基于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而失败。

+0

是applicationContext.xml的文本中的类路径或只是你活的? – tom 2014-10-27 23:50:36

+0

我只有一个applicationContext.xml,所以我认为这必须是活的......除非有些魔法/弹簧魔法以某种方式创建另一个。 – Tim 2014-10-27 23:51:33

+0

要单元测试这些,请使用构造函数注入和一个模拟库(如Mockito)。这可以让你完全避免使用Spring,并且在没有外部依赖的情况下单独测试这个类。 – chrylis 2014-10-28 00:08:37

回答

0

原来这很简单。如果你指定一个应用程序上下文不存在的路径Spring会抛出错误,例如:

@ContextConfiguration("classpath:does-not-exist.xml") 

以上将创建一个漂亮的简单的错误信息,告诉你问题是什么,也就是找不到文件的异常。另一方面,这段代码不会:

@ContextConfiguration("classpath:**/does-not-exist.xml") 

所以我的问题是,简单地说,Spring找不到应用程序上下文XML。最后我做了现场上下文的副本,在src/test/resources扔它,并更新了我的pom.xmlsurefire-plugin@ContextConfiguration如下:

<addtionalClasspathElements> 
    <addtionalClasspathElement>${basedir}/src/test/resources</addtionalClasspathElement> 
</addtionalClasspathElements> 

@ContextConfiguration(locations = { "classpath:applicationContext.xml", "classpath:applicationContext-Services.xml" })