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

youxin 阅读:83 2023-09-07 20:43:31 评论:0

我正在尝试为静态方法编写单元测试,该方法采用类和方法名称并进行一些反射以使用参数调用该方法并存储结果。我正在使用 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,我又懒又草:)


标签:Spring Boot
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号