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

how to unit test method dependent on springBoot applicationContext?

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

当我 运行 完整套件时,我的测试实际上有效,但是当我 运行 独立测试时,它失败了。问题是我创建了一个模拟 class(手写模拟,不使用 mockitoeasymock),我希望静态方法使用它。但是,反射无法检测到我的 mock class,因为 class 尚未被 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,我又懒又草:)