如何根据spring Boot应用程序上下文单元测试方法?

时间:2015-04-06 17:47:37

标签: java spring unit-testing spring-boot

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

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

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中的一个模拟bean,我可以手工完成,但是使用注释会有更多的spring方法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

我还必须扩展AbstractTestNGSpringContextTests,因为它是使用TestNG套件弹出好玩的唯一方法用于我们的测试。如果其他人正在使用junit测试而不是TestNG,请不要扩展AbstracTestNGSpringContextTests,相反我相信你想要添加注释:

@RunWith(SpringJUnit4ClassRunner.class)

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

希望这个答案可以节省其他人,他们试图找出如何只加载几个类而不是整个环境(我发现大多数例子都希望你加载配置文件,这些文件会加载每个bean,这很慢,老是不受欢迎的单元测试)。

可以说我仍然应该完全嘲笑SpringApplicationContext,我很懒散而且马虎:)