【问题标题】:Spring Injecting Beans from src folder in test foldersSpring从测试文件夹中的src文件夹注入Bean
【发布时间】:2016-07-07 21:29:56
【问题描述】:

我的源文件夹中的实用程序类公开为 bean。我想在用 junit 4 编写的测试类中使用其中一些实用程序。例如,我有一个实用程序类,它具有将对象编组为 JSON 字符串的方法。我想在我的测试类中注入这个实用程序 bean。我无法使用 Autowired 注释注入这些 bean。我应该将所有这些类复制到测试文件夹吗?

编辑:

我正在尝试注入 jsonUtil。下面是我的代码的样子。

import static org.junit.Assert.*;

import java.math.BigDecimal;

@RunWith(MockitoJUnitRunner.class)
@SpringApplicationConfiguration(classes = ProxyApplicationMock.class)
public class ProxyApplicationMock {

    @Mock
    public SoapClient soapClientMock;

    private JsonUtil jsonUtil;

主类

public class ProxyApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProxyApplication.class, args);
    }
}

【问题讨论】:

  • 您应该展示带有 Spring 上下文配置的测试类代码示例,并告诉我们您使用的是哪个版本的 Spring。
  • 嗨,马特,添加了代码,我正在使用 Spring Boot。
  • 好的,看看我的回答,如果有帮助,请告诉我。显示您的 Spring 配置文件也会有所帮助:ProxyApplicationMock
  • 我没有任何 spring 配置文件。我们正在使用 java 配置。
  • 啊,好吧,对不起,我没有看到@SpringApplicationConfiguration中提供的类是带注释的类。这是不正确的,你应该为你的测试提供一个配置类,你应该使用SpringJUnit4ClassRunner而不是MockitoJUnitRunner作为运行器。

标签: java spring junit


【解决方案1】:

您的主要课程可以被您的测试课程看到,但反之则不行。所以不,你不需要复制它们。

如果您的实用程序类在您的测试 Spring 上下文配置(@ContextConfiguration 中声明的类或 XML 文件)中声明为 Spring 托管 bean,这可能与您的主配置不同。

然后您可以将它注入任何 Spring 托管类,如果它使用 SpringJUnit4ClassRunner,则包括您的测试类。

编辑:

总结一下我们在 cmets 中讨论的内容,主要问题是您的测试运行程序不是 SpringRunnerSpringJUnit4ClassRunner 的别名),因此 JUnit 没有在 Spring 上下文中运行您的测试。看看a test example here

最简单的测试用例如下所示。

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class CityRepositoryIntegrationTests {
    @Autowired
    private MySpringBean springBean;
    //...
}

但与 Spring Boot 一样,背后也发生了一些神奇的事情。 @SpringBootTest 是一个方便的注解,它会自动检测一个用 @SpringBootConfiguration 注解的类,这意味着如果你的测试没有特定的 Spring 配置,它将使用你的主 Spring 配置,从而包含并实例化所有 bean对于您的主应用程序,这通常不是我们在单元测试中想要的,因为我们想通过模拟其依赖项来独立测试一个类。

您可以做的是提供您希望在测试中包含的 Spring 组件类,例如:

@RunWith(SpringRunner.class) 
@SpringBootTest(classes = MySpringBean.class)
public class CityRepositoryIntegrationTests {
    @Autowired
    private MySpringBean springBean;

    @Mock
    private MyMockedSpringBeanDependency mocked;
    //...
}

【讨论】:

  • 谢谢马特。我正在使用 Jackson ,但对我的 util 中的编组和解组部分进行了一些自定义
【解决方案2】:

这个问题是给马特的,因为添加评论会引发错误,说只能通知一次额外的使用。

注意:不是答案

我有一个应用程序类和许多在应用程序类中导入的配置类。早些时候它是@Configuration,我在Application类和实际的Config类中转换为@SpringBootConfiguration,我试图模拟谁的bean。结束于

java.lang.NoSuchMethodError: org.springframework.boot.SpringApplication.<init>([Ljava/lang/Object;)V
    at org.springframework.boot.test.context.SpringBootContextLoader.getSpringApplication(SpringBootContextLoader.java:121)
    at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:84)

请建议我如何模拟,我的设置与票证中指定的相同。

@Bean
    public CacheManager cacheManager()
    {
            EhCacheManagerFactoryBean factoryBean = new EhCacheManagerFactoryBean();
            factoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
            factoryBean.setShared(true);
            return new EhCacheCacheManager(factoryBean.getObject());
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2022-07-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    相关资源
    最近更新 更多