[初学Spring Boot](2):单元测试报错:org.junit.runners.model.InvalidTestClassError:Invalid test class

 本来:

是建项目时自动生成的测试类,结果还是报错了。大无语事件。

就是IDEA自建测试时导错包了。

 注释掉的时原来自导的,换成短的就好了。

经查证,长的是升级版,junit5,spring boot版本在2.2之后,方法不要public修饰;

短的,是旧版,junit4,spring boot版本在2.2之前,方法要用public修饰。

追问:

话是这么说,我的Spring Boot版本是2.7.4,Idea没有自建错啊,可为什么还是报错哦?

经测试,junit5是用不起来啊,用4是没问题的,用5又报空指针错误。

OK

行,行了下,可能是代码中junit4的部分代码没有改干净。果然,@Before注解是属于4的。搜一下5的,@BeforeAll,改好之后,import一下该有的包,自动完成。

 按住Ctrl键,鼠标放上面,ok,全部是junit5了。

再试

OK,又报错了。

读了一下错误原因,行嘞,把测试类加上这个注解吧。至于为什么,马上下班过国庆了,这里不延伸了。

该import的包,Idea会帮你自动导入。

OKOK

再试一次,成功!

okok

你注意到,上面我说,junit5测试方法无需public,我上面是有的。于是,我搞个混合测试

好了,其实,和public没有关系的。加不加无所谓了。

但是,junit4必须是public修饰,而且是void且无参。感兴趣看源码吧。这里不在展开。后续有机会一起看喽。

这样看,junit5是升级了哈,不用拘泥修饰符了。 

总结

原来啊,是我用junit5的架子填了junit4的代码啊。(junit5是Idea自动建的,因为我用了Spring Boot2.7.4版本)。

贴一下完整源码吧

方便像我一样的新手菜鸟学习使用。

首先是文件目录结构,请用Idea新建项目

我的jdk1.8.0.33,对应Java8,next选Java8

命名什么的,自己决定。 如图,com.wfy下,右键,new-package,新建了controller包,下新建class类,命名随意。又在test目录下,新建类了。注:test包系统自建。

 ok了,开始填代码:

//MyController
package com.wfy.test

import org.springframework.stereotype.Controller
import org.springframework.web.bind.annotation.RequesMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
public class MyController{
    @requestMapping("/MyLove")//浏览网址:localhost:8723/MyLove
    public String get(){
        return "Ky";
    }
}
//HelloController
package com.wfy.controller;

import org.springframework.web.bind.annotion.RequestMapping;
import org.springframework.web.bind.annotion.RestController;

@RestController
public class HelloController{
    @RequestMapping("/hello")//详情可看看我的《初学Spring Boot》(一)
    public String index(){
        return "Hello,World!";
    }
}
//TestApplicationTest
//此测试就是测试TestApplication类的。注意命名的技巧
package com.wfy.test;

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.extension.Extendwith;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import static org.hamcrest.Mathchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import ststic org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpirngBootTest
@ExtendWith(SpringExtension.class)
@AutoConfigureMockMvc
@TestInstance(TestInstance.Lifecycle.Per_CLASS)
class TestApplicationTests{
    private MockMvc mvc;
    //private MockMvc mvc1;

    @BeforeAll
    void setUp() throws Exception{
        mvc=MockMvcBuilders.standaloneSetup(new MyController()).build();
        //mvc1=MockMvcBuilders.standaloneSetup(new HelloController()).build();
    }
    @Test
    void contextLoads() throws Exception{     
         mvc.perform(MockMvcRequestBuilders.get("/MyLove")
        .Accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andExpect(content().string(equalTo("Ky")));
         //mvc1.perform(MockMvcRequestBuilders.get("/hello")
       // .Accept(MediaType.APPLICATION_JSON))
        //.andExpect(status().isOk())
        //.andExpect(content().string(equalTo("Hello World!")));
        System.out.println("Yes!Got it!");
    }
}

这里,我本来只写了一个/MyLove的测试。其实,还有一个/hello的。按照这个样子加一个,结果报错了

 

 这意思是断言错误。细心的朋友,可能会发现,mvc1赋值时,没有修改为我另一个HelloController,所以实例化错误了。

修改一下,搞定,收工! 

先过国庆了,剩下的事,以后再说!

Over!再聊!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值