解决junit获取注入bean问题:
注解引入多个配置文件情况:
我们使用spring写junit单测的时候,有的时候我们的spring配置文件只有一个。我们在类的注释上面会这样写:
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(locations = "classpath*:spring-ctx-application.xml")
但有的时候我们的项目很复杂,其中的spring配置文件被拆分成了多个,这样该如何写上面这段单测代码而引入多个配置文件呢?如下:
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(locations = { "classpath*:spring-ctx-application.xml",
- "classpath*:spring-ctx-consumer.xml" })
这样就可以轻松的引入多个spring的配置文件了。
或者配置符合某一个正则表达式的一类文件,如:
- @RunWith(SpringJUnit4ClassRunner.class)
- @ContextConfiguration(locations = "classpath*:spring-ctx-*.xml")
@Test有这个注解即可立即运行
可能有些当时web运行的注入方式可以,但是测试junit就有问题,可以注了或改写,或把一些不严格的格式配置文件按格式重写
例如
ehcache-shiro.xml:之前没有写命名空间不严格测试junit出现ehcache不可识别
<?xml version="1.0" encoding="UTF-8"?> <ehcache updateCheck="false" name="shiroCacheLiCai" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <!-- timeToIdleSeconds 当缓存闲置n秒后销毁 为了保障会调用ShiroSessionDao的doReadSession方法,所以不配置该属性 timeToLiveSeconds 当缓存存活n秒后销毁 必须比Redis中过期时间短 --> <defaultCache maxElementsInMemory="10000" eternal="false" timeToLiveSeconds="3600" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="10" /> </ehcache>
示例:
注意:把java/mian/test设置成test目录才可以引入以下注解
import com.alibaba.dubbo.config.annotation.Reference; import com.alibaba.fastjson.JSON; import com.houbank.basic.util.page.Pagination; import com.houbank.incoming.api.CacheFacade; import com.houbank.incoming.api.FinancialSalesUserFacade; import com.houbank.incoming.model.condition.FinancialSalesUserCondition; import com.houbank.incoming.web.controller.FinancialSalesUserController; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.util.Base64Utils; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.io.UnsupportedEncodingException; /** * Created by winner_0715 on 2017/1/7. */ @RunWith(SpringJUnit4ClassRunner.class) //使用junit4进行测试 @ContextConfiguration(locations={"classpath*:spring/applicationContext.xml","classpath*:spring/ehcache-shiro.xml"}) //加载配置文件 public class TestGet { @Autowired private CacheFacade cacheFacade; @Autowired private RestTemplate restTemplate1; @Before public void setUp() throws Exception { } @After public void tearDown() throws Exception { } /** * 要请求的url,一般放在配置文件中 */ // @Value(value = "@{remote.url}") private String remoteUrl; @Test public void postRemoteData() throws UnsupportedEncodingException { /** * 设置请求头 */ HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); headers.add("Accuept", MediaType.APPLICATION_JSON.toString()); /** * POST请求参数,根据需要进行封装 */ String bodyData = "";//new String(Base64Utils.encode(JSON.toJSONString(ro).getBytes("UTF-8"))); /** * 查看HttpEntity的构造方法,包含只有请求头和只有请求体的情况 */ HttpEntity<String> httpEntity = new HttpEntity<String>(bodyData, headers); /** * 执行操作 */ FinancialSalesUserCondition cd = new FinancialSalesUserCondition(); remoteUrl="http://localhost:8080/hb_phonebank_web/financialSalesUser/listPage"; // getweixinBaseInfoList(); ResponseEntity<Pagination> result = restTemplate1.postForEntity(remoteUrl,cd,Pagination.class); } /** * 模拟请求参数 */ private class ParameterRo { private Integer id = 123; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } } public RestTemplate getRestTemplate1() { return restTemplate1; } public void setRestTemplate1(RestTemplate restTemplate1) { this.restTemplate1 = restTemplate1; } public String getRemoteUrl() { return remoteUrl; } public void setRemoteUrl(String remoteUrl) { this.remoteUrl = remoteUrl; } }
相关推荐
在解决bean注入问题的同时,我们还注意到一个关于`Scanner`在IDEA的JUnit测试中无效的问题。在进行标准输入操作时,`Scanner`在JUnit测试环境下可能无法正常工作,因为它不提供交互式控制台。为了解决这个问题,你...
3. **直接下载JAR**:如果你的项目不使用构建工具,可以直接从JUnit官方网站或者第三方下载站点获取最新版本的JUnit JAR文件,如`junit.jar`,然后将其添加到项目的类路径中。 4. **IDE集成**:大多数现代Java IDE...
如果有失败,JUnit会提供详细的失败信息帮助定位问题。 在"mbts"这个文件夹中,可能包含了这个示例项目的源代码、测试代码和相关的配置文件。为了更深入地理解这个Demo,你可以检查其中的`src/test/java`目录,看看...
在 `Spring` 框架中,`DAO` 类会被配置为 `Spring` 的bean,通过依赖注入来获取数据库连接或其他依赖。在测试 `DAO` 层时,我们不希望真正地连接到数据库,而是使用模拟数据或内存数据库来避免副作用和提高测试效率...
在Spring中,我们可以配置bean定义,实现事务管理,以及使用Spring MVC进行Web开发。在本实例中,Spring可能被用来管理数据库连接、事务处理和Service层的实现。 **MyBatis** 是一个持久层框架,它允许开发者将SQL...
这三份API文档对于理解和使用这些技术至关重要,开发者可以通过查阅它们深入学习各个框架的内部机制,提高编程技能,解决实际问题。无论是开发动态网站、编写单元测试还是构建复杂的企业级应用,这些API都将提供强大...
它主要用于实现复杂的属性注入需求,例如获取某个Bean的嵌套属性值,并将该值注入到另一个Bean中。 #### 四、示例分析 为了更好地理解`PropertyPathFactoryBean`的使用,我们来看一个具体的示例: ```java package...
Spring是一个全面的Java应用开发框架,它提供了依赖注入(DI)和面向切面编程(AOP)的能力,简化了Java企业级应用的开发。Spring的核心特性包括Bean容器、数据访问/集成、MVC框架、事务管理、批处理和更多。在...
在这个测试类中,`ClassPathXmlApplicationContext`用于加载配置文件并创建Spring容器,然后通过`getBean`方法获取`Client`的实例,执行其业务逻辑。 总结来说,Spring的构造器注入使我们能够明确地声明类的依赖,...
`BeanFactory`提供了对Bean的声明式管理,包括获取Bean、配置Bean等操作。在实际应用中,我们通常使用的是`DefaultListableBeanFactory`,这是Spring实现的一个具体Bean工厂,支持大量的Bean定义。 在源码分析过程...
最后,编写测试类,利用Spring的ApplicationContext获取Bean并进行测试。 5. 测试实践:在"testUniversal"目录下的测试文件,是整个工程的测试入口。它们通常会包含对业务逻辑、DAO操作等的验证,通过模拟各种输入...
1. **Spring测试支持**:Spring提供了对JUnit的集成,允许开发者在测试中利用Spring的IoC(控制反转)容器,方便地获取和管理测试所需的对象。这通常通过`@RunWith(SpringRunner.class)`注解来实现,该注解将JUnit...
在测试场景中,Spring Test模块提供了JUnit支持,让我们可以在测试中轻松地获取到已经被Spring管理的bean。 要创建一个Spring JUnit测试,我们需要引入以下依赖: 1. `spring-test`:这是Spring的测试模块,包含...
JUnit和其他测试框架提供了方便的方法来创建Bean的测试实例,检查其行为和属性。 总之,"有用的bean"压缩包可能包含了各种类型的Java Bean,涵盖了从基本的数据封装到复杂的业务逻辑处理。无论是对新手还是有一定...
3.12 将Spring Bean注入领域对象 147 3.12.1 问题 147 3.12.2 解决方案 147 3.12.3 工作原理 148 3.13 小结 151 第4章 Spring中的脚本 152 4.1 用脚本语言实现Bean 152 4.1.1 问题 152 4.1.2 解决...
3.12 将Spring Bean注入领域对象 147 3.12.1 问题 147 3.12.2 解决方案 147 3.12.3 工作原理 148 3.13 小结 151 第4章 Spring中的脚本 152 4.1 用脚本语言实现Bean 152 4.1.1 问题 152 4.1.2 解决...
在XML配置中,当声明一个bean为`FactoryBean`类型时,需要使用`&`符号来获取`FactoryBean`本身而不是它创建的对象。例如: ```xml <bean id="myFactory" class="com.example.MyFactoryBean"/> <bean id="myBean" ...
在实际开发中,开发者需要理解每个框架的核心概念,如Spring的Bean管理、Struts的动作调度、MyBatis的SQL映射,以及JUnit的测试方法,以便更好地利用SSM框架提高开发效率和代码质量。同时,理解源码可以帮助开发者...
2.3 注入Bean属性 2.3.1 注入简单的数值 2.3.2 使用其他的Bean 2.3.3 装配集合 2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean...