本来:
是建项目时自动生成的测试类,结果还是报错了。大无语事件。
就是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,所以实例化错误了。
修改一下,搞定,收工!
先过国庆了,剩下的事,以后再说!