我在源文件夹中将实用程序类公开为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;
答案 0 :(得分:1)
您的主要课程可以通过您的测试课程看到,但不是相反。所以不,你不需要复制它们。
如果您的实用程序类在测试Spring上下文配置(在@ContextConfiguration
中声明的类 - 或XML文件)中被声明为Spring托管bean,这可能并且可能应该与您的主配置不同。< / p>
然后你可以在任何Spring托管类中注入它,如果它使用SpringJUnit4ClassRunner
,它包括你的测试类。
编辑:
总结我们在评论中讨论的内容,主要问题是您的测试运行器不是SpringRunner
(SpringJUnit4ClassRunner
的别名),因此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());
}
}