Spring基础篇(3)-单元测试

JAVA && Spring && SpringBoot2.x — 学习目录

在使用Spring项目做单元测试时,测试类的注解的含义。

idea小技巧:在任意类,任意接口名上,可以通过Ctrl+Shift+T来直接创建测试类,mac使用[command+N]

1. 测试方法注解的含义

1.1 Spring整合Junit

maven依赖:

 <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

测试类源码:

@RunWith(SpringJUnit4ClassRunner.class)
@Transactional(transactionManager = "transactionManager")
@Rollback(value=false)
@ContextConfiguration(locations = {"classpath*:/applicationContext.xml"})
public class MultiThreadTest {

    @Autowired
    private ClassA classA;

    @Test
    public void testsetAsyncMethods() {
        classA.setAsyncMethods();
    }
}

含义解释:

  1. RunWith注解:就是一个运行器,指定测试方法在哪里运行的,默认的配置是:SpringJunit4ClassRunner.class类。即Spring测试环境。

    • RunWith(JUnit.class)就是使用JUnit来运行。

    • RunWith(SpringJunit4ClassRunner.class)让测试运行于Spring测试环境。

    • RunWith(Suite.class)的话就是一套测试集合。

  2. ContextConfiguration注解:导入配置文件。

    • @ContextConfiguration(Locations="../applicationContext.xml") 导入配置文件路径。
    • @ContextConfiguration(classes = SimpleConfiguration.class)导入配置文件的class类。
  3. Transactional注解:声明事务管理器。配合@Rollback注解使用。

    • @Rollback(value=true),那么表示测试时如果涉及到数据库操作,那么测试完毕,该操作会回滚,不会改变数据库内容。

    • @Rollback(value=flase),那么表示测试时如果涉及到数据库操作,那么测试完毕,测试的内容中对数据库的操作会真实的执行到数据库中,不会回滚。

1.2 SpringBoot整合Junit

1.2.1 SpringBoot对Service实现单元测试

1. maven依赖

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>  

2. 测试类

@RunWith(SpringRunner.class)
@SpringBootTest
public class LearnServiceTest {

    @Autowired
    private LearnService learnService;

    @Test
    public void getLearn(){
        LearnResource learnResource=learnService.selectByKey(1001L);
        Assert.assertThat(learnResource.getAuthor(),is("嘟嘟MD独立博客"));
    }
}

1.2.2 @SpringBootTest中注解的含义

SpringBoot中提供了一个@SpringBootTest的注解,当您需要Spring Boot功能时,它可以用作标准spring-test@ContextConfiguration注解的替代方法,注解的工作原理是通过SpringApplication在测试中创建ApplicationContext。

  1. 在Spring Boot1.4以上的版本一般情况是这样的:
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootStarterTests {
  1. 在普通Spring项目中的测试一般是这样的:
@RunWith(SpringRunner.class)
@ContextConfiguration(locations={"classpath:spring-servlet.xml", "classpath:spring-dao-test.xml", "classpath:spring-service-test.xml"})
public class MemberTest {

需要注意的是,在@SpringBootTest注解中可以指定启动类。

@SpringBootTest(classes = ApiApplication.class)

1.2.3 @AutoConfigureMockMvc注解的含义

引入MockMVC[模拟]进行控制层的单元测试。

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class MockXXXTest {
    @Autowired
    protected MockMvc mockMvc;
    @Autowired
    private WebApplicationContext webApplicationContext;
    @Before
    public void before() {
        //获取mockmvc对象实例
        mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
    }
    @Test
    public void TestXXX() throws Exception {
       MvcResult result = mockMvc.perform(
                MockMvcRequestBuilders.get("/xxxController/xxx_query")
                      .contentType(MediaType.APPLICATION_JSON_UTF8)      
                      .param("xxx","xxx")
              )
                .andExpect(MockMvcResultMatchers.status().isOk())
                .andDo(MockMvcResultHandlers.print())
                .andReturn();
       //输出状态码
       int status = result.getResponse().getStatus();
       //将返回参数转化为String
        String contentAsString = result.getResponse().getContentAsString();
    }
}
}
  1. perform() [pəˈfɔːm] [执行]执行一个MockMvcRequestBuilders请求。其中get()表示发送get请求(可以使用get、post、put、delete等);contentType()设置请求实体类型;param()请求参数,可以带多个。

  2. andExpect()添加 MockMvcResultMatchers验证规则,验证执行结果是否正确。

  3. andDo()添加 MockMvcResultHandlers结果处理器,这是可以用于打印结果输出。

  4. andReturn()结果还回,然后可以进行下一步的处理。

  5. result.getResponse().getContentAsString()将响应内容转化成String字符串(JSON格式),后续可转换为对象。


2. classpath路径的含义

需要注意的是:@ContextConfiguration若是导入多个文件,可以使用{},即@ContextConfiguration(locations = { "classpath*:/spring1.xml", "classpath*:/spring2.xml" })而且可以使用classpath路径

classpath路径到底指的是什么?

  1. src路径下的文件在编译后就会放到WEB-INF/class路径下面,默认的classpath就是在这里。(敲黑板,划重点)直接放到WEB-INF/下的话是不在classpath下的。
  2. 用maven构建项目时,resources目录就是默认的classpath。

classpath和classpath*的区别?
* classpath只会在class路径下查找文件;classpath*不仅包含class路劲,还包括jar文件中(class路径)进行查找。
* 在多个classpath中存在同名资源,都需要加载时,那么classpath只会加载第一个;classpath*都会加载。

推荐阅读

1. Spring Boot干货系列:(十二)Spring Boot使用单元测试

2. junit的标签

3.(写的很不错)Springboot 中使用单元测试

4. 在SpringBoot中使用MockMvc进行单元测试

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容