200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > [初学Spring Boot](2):单元测试报错:org.junit.runners.model.InvalidTestClassError:Invalid test class

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

时间:2019-04-18 05:40:48

相关推荐

[初学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了,开始填代码:

//MyControllerpackage com.wfy.testimport org.springframework.stereotype.Controllerimport org.springframework.web.bind.annotation.RequesMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controller@ResponseBodypublic class MyController{@requestMapping("/MyLove")//浏览网址:localhost:8723/MyLovepublic String get(){return "Ky";}}

//HelloControllerpackage com.wfy.controller;import org.springframework.web.bind.annotion.RequestMapping;import org.springframework.web.bind.annotion.RestController;@RestControllerpublic 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;@BeforeAllvoid setUp() throws Exception{mvc=MockMvcBuilders.standaloneSetup(new MyController()).build();//mvc1=MockMvcBuilders.standaloneSetup(new HelloController()).build();}@Testvoid 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!再聊!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。