无法在 Spring 中设置 Mock Class

Cannot setup Mock Class in Spring

我要进行一个项目,其中有一套集成测试。其中一项测试自动连接了一个 class,它对第 3 方供应商进行了大量网络调用。因为我们不希望我们的测试进行这些调用,团队通过 testApplicationContext.xml Spring 配置文件模拟了这个客户端。

集成测试Class:

@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 中。

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

Cannot find class [tst.mycompany.mocks.MockAdressService] for bean with name 'addressService' defined in class path resource [mock-beans.xml]; nested exception is 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 文件夹,编译的 class 在那里。

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