无法在Spring中设置Mock类

时间:2016-03-29 17:52:06

标签: spring mocking springjunit4classrunner

我正在进入一个集成测试套件的项目。其中一个测试自动安装了一个类,该类对第三方供应商进行了大量网络调用。因为我们不希望我们的测试进行这些调用,所以团队通过testApplicationContext.xml Spring配置文件模拟了这个客户端。

集成测试类:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/testApplicationContext.xml")
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
@Transactional
public class IntegrationTest {

testApplication.xml的定义:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
        http://www.springframework.org/schema/cache/spring-cache.xsd
        http://www.springframework.org/schema/jee
        http://www.springframework.org/schema/jee/spring-jee-3.1.xsd">

    <aop:aspectj-autoproxy />
    <context:component-scan base-package="com.mycompany" />
    <context:component-scan base-package="tst.mycompany.mocks"/>
    <import resource="mock-beans.xml"/>

mock-beans.xml的定义:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"...>
    <!-- Override bean definitions with mocks -->
    <bean id="thirdPartyClientService" class="tst.mycompany.mocks.MockThirdPartyClient" />
</beans>

这在我们的设置中工作正常,并且当作为测试运行时,MockThirdPartyClient的实例会自动连接到我们的spring bean中。

但是,我最近在同一个软件包中添加了另一个服务的新模拟,但无法加载它。我收到错误:

  

找不到名为&#39; addressService&#39;的bean的类[tst.mycompany.mocks.MockAdressService]在类路径资源[mock-beans.xml]中定义;嵌套异常是java.lang.ClassNotFoundException:tst.mycompany.mocks.MockAdressService

这是更新的 mock-beans.xml

<beans xmlns="http://www.springframework.org/schema/beans">
    <!-- Override bean definitions with mocks -->
    <bean id="thirdPartyClientService" class="tst.mycompany.mocks.MockThirdPartyClient" />
    <bean id="addressService" class="tst.mycompany.mocks.MockAdressService" />
</beans>

以下是我如何自动启动有效的初始依赖关系:

@Autowired ThirdPartyClientServiceI client;

和那个没有的人:

@Autowired AddressServiceI addressService;

我已经仔细检查了所有内容的拼写,并且所有内容都排成一列,所以这很疯狂,这是不行的。我想也许这是一个被错误缓存的事情...但我刷新并清理了一切,但仍然没有骰子。

这些模拟都没有注释FWIW,它们只是实现了他们设计用来模拟的服务接口。它们都位于src/test/java文件夹下。

package tst.mycompany.mocks;

public class MockAddressService implements AddressServiceI {

有问题的堆栈跟踪:

Caused by: java.lang.ClassNotFoundException: tst.mycompany.mocks.MockAdressService
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[?:1.8.0_71]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:1.8.0_71]
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) ~[?:1.8.0_71]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:1.8.0_71]
    at org.springframework.util.ClassUtils.forName(ClassUtils.java:250) ~[spring-core-4.2.2.RELEASE.jar:4.2.2.RELEASE]

我确实检查了bin文件夹,编译后的类就在那里。

1 个答案:

答案 0 :(得分:0)

这很令人尴尬,但我在mock-beans.xml中的bean定义中输入了一个拼写错误: MockAdressService应该是MockAddressService(缺少'd')