java - 如何对依赖于springBoot applicationContext的方法进行单元测试?

标签 java spring unit-testing spring-boot

我正在尝试为静态方法编写单元测试,该方法采用类和方法名称并进行一些反射以使用参数调用该方法并存储结果。我正在使用 spring-boot

当我运行完整套件时,我的测试确实有效,但当我以独立方式运行测试时,它失败了。问题是我创建了一个模拟类(手写模拟,不使用 mockitoeasymock),我希望静态方法使用它。但是,反射无法检测到我的模拟类,因为该类尚未被 spring-boot 加载到 applicationContext 中。这是失败的行:

T proxy = SpringApplicationContext.getBean(clazz);

SpringApplicationContext 定义:

@Component
public class SpringApplicationContext implements ApplicationContextAware
{
    private static ApplicationContext applicationContext_;

@Override 
public void setApplicationContext(ApplicationContext applicaitonContext) throws BeansException {
    applicationContext_=applicaitonContext;
}

public static <T> T getBean(Class<T> requiredType) throws beanException {
      return applicationContext_.getBean(requiredType);
}

*注意,我不得不重新手动输入,请假设明显的语法错误是打字错误。

所以基本上我的 applicationContext 没有被设置或定义。我只需要在 applicationContext 中有一个 mock bean,我可以手动完成,但是是否有更多使用注释的 spring 方法?

最佳答案

事实证明,我的测试没有工作,而是单独运行或作为套件的一部分运行,我有一个单独的问题,即对 @BeforeTest 使用错误的注释,这在运行整个套件时掩盖了缺陷。

修复非常简单。我在测试上方添加了 SpringApplicationConfiguration 注释:

@SpringApplicationConfiguration(classes =
    {
        MockController.class,
        SpringApplicationContext.class
   }
public class MyTest extends AstractTestNGSpringContextTests

这有两个部分。 @SpringApplicationCOnfiguration 仅加载我列出的那些值。我本可以指向配置类,但这最终会加载我环境中的大部分 bean,这对于单元测试来说太过分了。因此,我加载了我的 ApplicationContext 中所需的两个 @component 对象,以便我的单元测试仅工作。

我还必须扩展 AbstractTestNGSpringContextTests,因为这是让 Spring 与用于我们测试的 TestNG 套件配合良好的唯一方法。如果其他人使用的是 junit 测试而不是 TestNG,请不要扩展 AbstracTestNGSpringContextTests,相反我相信您想添加注释:

@RunWith(SpringJUnit4ClassRunner.class)

虽然我没有使用它,因为我没有使用 junit。

希望这个答案能拯救那些试图找出如何只加载几个类而不是整个环境的人(我发现的大多数例子都希望你加载将加载每个 bean 的配置文件,这很慢而且老实说是不受欢迎的单元测试)。

可以说我仍然应该完全模拟 SpringApplicationContext,我又懒又草:)

关于java - 如何对依赖于springBoot applicationContext的方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29476560/

相关文章:

java - 将 arraylist 添加到 Jlist

java - Spring Boot 防止 "Port In use"

Spring Boot自定义查询MongoDB

java - JPA:删除具有相关子项的父项

ios - Xcode 单元测试 - 无法添加新测试,因为它没有运行

java - Kryo 序列化程序在底层 Scala 类 WrappedArray 上导致异常

java - <t :selectOneRadio link to backbean problem

java - 上传文件时出现 "Could not delete file C:\Users\..."错误

iPhone开发单元测试链接问题

python-2.7 - 测试期间无法禁用WTF CSRF保护