?本來:
是建項(xiàng)目時(shí)自動(dòng)生成的測試類,結(jié)果還是報(bào)錯(cuò)了。大無語事件。
就是IDEA自建測試時(shí)導(dǎo)錯(cuò)包了。
?注釋掉的時(shí)原來自導(dǎo)的,換成短的就好了。
經(jīng)查證,長的是升級版,junit5,spring boot版本在2.2之后,方法不要public修飾;
短的,是舊版,junit4,spring boot版本在2.2之前,方法要用public修飾。
追問:
話是這么說,我的Spring Boot版本是2.7.4,Idea沒有自建錯(cuò)啊,可為什么還是報(bào)錯(cuò)哦?
經(jīng)測試,junit5是用不起來啊,用4是沒問題的,用5又報(bào)空指針錯(cuò)誤。
OK
行,行了下,可能是代碼中junit4的部分代碼沒有改干凈。果然,@Before注解是屬于4的。搜一下5的,@BeforeAll,改好之后,import一下該有的包,自動(dòng)完成。
?按住Ctrl鍵,鼠標(biāo)放上面,ok,全部是junit5了。
再試
OK,又報(bào)錯(cuò)了。
讀了一下錯(cuò)誤原因,行嘞,把測試類加上這個(gè)注解吧。至于為什么,馬上下班過國慶了,這里不延伸了。
該import的包,Idea會幫你自動(dòng)導(dǎo)入。
OKOK
再試一次,成功!
okok
你注意到,上面我說,junit5測試方法無需public,我上面是有的。于是,我搞個(gè)混合測試
好了,其實(shí),和public沒有關(guān)系的。加不加無所謂了。
但是,junit4必須是public修飾,而且是void且無參。感興趣看源碼吧。這里不在展開。后續(xù)有機(jī)會一起看嘍。
這樣看,junit5是升級了哈,不用拘泥修飾符了。?
總結(jié)
原來啊,是我用junit5的架子填了junit4的代碼啊。(junit5是Idea自動(dòng)建的,因?yàn)槲矣昧薙pring Boot2.7.4版本)。
貼一下完整源碼吧
方便像我一樣的新手菜鳥學(xué)習(xí)使用。
首先是文件目錄結(jié)構(gòu),請用Idea新建項(xiàng)目
我的jdk1.8.0.33,對應(yīng)Java8,next選Java8
命名什么的,自己決定。?如圖,com.wfy下,右鍵,new-package,新建了controller包,下新建class類,命名隨意。又在test目錄下,新建類了。注:test包系統(tǒng)自建。
?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")//瀏覽網(wǎng)址: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")//詳情可看看我的《初學(xué)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!");
}
}
這里,我本來只寫了一個(gè)/MyLove的測試。其實(shí),還有一個(gè)/hello的。按照這個(gè)樣子加一個(gè),結(jié)果報(bào)錯(cuò)了
?
?這意思是斷言錯(cuò)誤。細(xì)心的朋友,可能會發(fā)現(xiàn),mvc1賦值時(shí),沒有修改為我另一個(gè)HelloController,所以實(shí)例化錯(cuò)誤了。
修改一下,搞定,收工!?文章來源:http://www.zghlxwxcb.cn/news/detail-725256.html
先過國慶了,剩下的事,以后再說!文章來源地址http://www.zghlxwxcb.cn/news/detail-725256.html
Over!再聊!
到了這里,關(guān)于[初學(xué)Spring Boot](2):單元測試報(bào)錯(cuò):org.junit.runners.model.InvalidTestClassError:Invalid test class的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!