Spring从测试文件夹中的src文件夹中注入Bean

时间:2016-07-07 21:29:56

标签: java spring junit

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

编辑:

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

:e ++enc=EBCDIC-US
:e ++enc=EBCDIC-AT-DE-A

主类

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;

2 个答案:

答案 0 :(得分:1)

您的主要课程可以通过您的测试课程看到,但不是相反。所以不,你不需要复制它们。

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

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

编辑:

总结我们在评论中讨论的内容,主要问题是您的测试运行器不是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 compnent类,如下:

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

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

答案 1 :(得分:0)

这个问题是马特(Matt)的问题,因为添加评论会引发错误,提示只能通知另外一种用途。

注意:不是答案

我有一个Application类和许多在Application类中导入的配置类。早先是@Configuration,我在Application类和实际的Config类中将其转换为@SpringBootConfiguration,我尝试模拟的whos 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());
        }
    }