1.Edit configurations
在Idean的Edit configurations中编辑应用,
**
** ①,配置VM options的参数时要以:-DparamName的格式设置参数。
springboot Application 中-Dserver…port=8083
②,配置程序参数,program arguments,使用 --paramName 的格式,也能设置程序参数。
2update run****策略
**
- none 不做改变
- update resources 更新配置资源
- update resources and classes 更新配置资源和class字节码文件
**
3.pom 导入jar失败时
**
Intellj 的自动载入maven功能有时候很好用,但是有时候会碰到很多问题,导致pom文件修改却没有触发自动重写载入。
此时需要手动强制更新依赖:
-
手动删除Project Setting 里面的libraries 包
-
在Maven Project点击clean功能,删除之前编译过得文件
- 项目右键 --》 maven --》 Reimport
**
4 - [ ] application.yml 配置失效 ,maven 配置失效,扫描不到配置
**
那些什么配置文件扫描不到,还有那些配置失效
首先,确认你的编译过后的target里面的配置是在里面的,如果没有编译过去,还读取个鸡儿。
怎么配置?
编译确保这些文件被编译过去了。如果是maven项目,标签下下就是配置这个的,现在我贴上我的配置,以后出现配置失效,记得看target目录下有有没有这个配置文件
-
5
-
SpringBoot怎么写单元测试
SpringBoot提供注解的方式编写单元测试,可以使用SpringBootTest注解来标示测试类。@RunWith(SpringRunner.class)
@SpringBootTest
@Test
public void method(){
}
这样写只能解决没有一些配置文件的测试逻辑,比如没有数据库配置、数据库连接池配置等。如果有这些配置,你就需要这样写了。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@Test
public void method(){
}
这样就可以正常运行了。
测试controller类。使用了Mock,网上大多流传的是下面这种方法,添加@WebAppConfiguration,使用MockMvc去进行单元测试,但是我的项目如下使用就出现了问题,执行的时候找不到Controller类,网上百度了各种方法都不管用。都会报 no bean of ‘controller’ type found错误。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@WebAppConfiguration
public class ControllerTest {
private MockMvc mockMvc;
@Autowired
private WebApplicationContext wac;
@Before // 在测试开始前初始化工作
public void setup() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void getMessageTest() throws Exception {
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get("/test/getMessage"))
.andDo(MockMvcResultHandlers.print()).andReturn();
int status = mvcResult.getResponse().getStatus();
String content = mvcResult.getResponse().getContentAsString();
Assert.assertTrue("success", status == 200);
Assert.assertFalse("failed", status != 200);
System.out.println("content" + content);
}
后来换了一种方式写,直接new个controller。测试运行,不报no bean of ‘controller’ type found错误了。但是在controller中使用的service报了空指针异常NPE,传递性就很明显了,controller是new的一个对象,所以注解不起作用,service就为null。
最后通过使用@AutoConfigureMockMvc+@MockBean的方式可以实现简单的单元测试,并且不会对数据产生影响,且不会对数据库产生影响。
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@AutoConfigureMockMvc
public class ImkfMessageReportControllerTest {
/**
* 初始化MockMvc
*/
@Autowired
private MockMvc mvc;
/**
* 测试的controller
*/
@MockBean
private UserController userController;
@Test
public void getUserListTest() throws Exception {
MvcResult mvcResult = mvc.perform(MockMvcRequestBuilders.get("/user/getUserList"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(MockMvcResultHandlers.print())
.andReturn();
String content = mvcResult.getResponse().getContentAsString();
System.out.println("content" + content);
}
SpringBoot使用Mockito进行单元测试
上面是使用MockMvc,虽然能够验证短链接甚至service代码逻辑的正确性,能够正常测试接口的问题。但是缺点也不少,比如,覆盖率并没有提升。Mockito是一个非常好用的单元测试工具,它的实现原理是继承要Mock的类,将所有的公有方法进行重写。
@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {
@Mock
private UserMapper userMapper;
@InjectMocks
private UserService userService;
@Test
public void save() throws Exception {
User user = new User();
user.setUserName(Long.valueOf("springBoot"));
when(userMapper.insert(user)).thenReturn(user);
User num = userService.save(user);
Assert.assertEquals("success", "springBoot", num.getUserName);
}
}
使用RunwWith(MockitoJUnitRunner.class)来进行mocktio测试,注解@Mock标记一个类或者接口是需要被mock的。@InjectMocks将所有的mock对象都放入需要测试的类的对象中。使用时,方法里面调用到UserMapper.insert(),那么需要对UserMapper.insert()进行打桩,设置预期返回值。
打桩时,传递的参数(如果有)必须为调用时的同一个对象或者相同值,如果传入的参数是一个对象,那么需要对这个对象进行打桩,再调用打桩的方法。比如,when(userMapper.insert(user)).thenReturn(rUser),插入一个user对象,如果user插入之前要进行校验或者其他操作,需要对这个对象进行打桩,rUser同理。如果插入的对象非常复杂,用构造方法来构造一个空对象,或者构造方法所用的对象不能直接构造,但是没有public的方法来设置值,怎么办?
我们知道一个对象的类一定有get方法,我们可以通过Mock来伪装一个对象,在将要测试的方法体内,如果某行调用了这个对象的任意方法(toString()、equals()、get()),我们都可以以相同的参数进行打桩后设置返回值,这样就能通过参数校验等环节,执行后面的代码逻辑,同时能够提高覆盖率。
@Mock
private User user;
when(user.get(eq("userName"))).thenReturn("123456");
when(user.get(eq("seq"))).thenReturn(4);
when(user.get(eq("password"))).thenReturn("132242312");
when(user.get(eq("u_id"))).thenReturn("654321");
==================================
SpringBoot:SpringBoot项目进行单元测试
JUnit是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量。
JUnit中常用的的注解如下:
@BeforeClass:针对所有测试,只执行一次,且必须为static void。
@Before:初始化方法,执行当前测试类的每个测试方法前执行。
@Test:测试方法,在这里可以测试期望异常和超时时间。
@Test(timeout = 1000) 测试方法执行超过1000毫秒后算超时,测试将失败。
@Test(expected = Exception.class) 测试方法期望得到的异常类,如果方法执行没有抛出指定的异常,则测试失败。
@After:释放资源,执行当前测试类的每个测试方法后执行。
@AfterClass:针对所有测试,只执行一次,且必须为static void。
@Ignore:忽略的测试方法(只在测试类的时候生效,单独执行该测试方法无效)。
@RunWith:可以更改测试运行器 ,缺省值 org.junit.runner.Runner
一个单元测试类执行顺序为:
@BeforeClass –> @Before –> @Test –> @After –> @AfterClass
每一个测试方法的调用顺序为:
@Before –> @Test –> @After
Spring Boot进行单元测试,主要分为不依赖web模块的单元测试(Service)和依赖web模块的单元测试(Controller)两种。测试步骤如下:
1、在pom中添加Jar包依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
2、不依赖web模块的单元测试(Service)
import com.example.bean.Student;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Application.class)
public class StudentServiceTest {
@Autowired
private StudentService studentService;
@Test
public void findOne() throws Exception {
//测试Id为1的学生年龄是否为20
Student student = studentService.findOne(1);
Assert.assertEquals(new Integer(20), student.getAge());
}
}
3、依赖web模块的单元测试(Controller)
get请求访问Testcontroller,路径+"/hello"返回hello字符串。验证接口是否正常以及返回预期结果判定如下:
@RunWith(SpringRunner.class)
@SpringBootTest(classes=Application.class)
public class SpringbootDemoApplicationTests {
@Autowired
private WebApplicationContext webApplicationContext;
private MockMvc mockMvc;
@Test
public void hello() throws Exception {
String url = "/hello";//访问url
String expectedResult = "hello";//预期返回结果
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.get(url).accept(MediaType.APPLICATION_JSON)).andReturn();
//访问返回状态
int status = mvcResult.getResponse().getStatus();
System.out.println(status);
//接口返回结果
String content = mvcResult.getResponse().getContentAsString();
System.out.println(content);
//打印结果和状态
//断言状态
Assert.assertTrue("成功", status == 200);
Assert.assertFalse("失败", status != 200);
//断言结果
Assert.assertTrue("数据一致", expectedResult.equals(content));
Assert.assertFalse("数据不一致", !expectedResult.equals(content));
解释:
A. @SpringBootTest注解是普通的 Spring 项目(非 Spring Boot 项目)中编写集成测试代码所使用的@ContextConfiguration注解的替代品。其作用是用于确定如何装载 Spring 应用程序的上下文资源。
当运行 Spring Boot 应用程序测试时,@SpringBootTest注解会自动的从当前测试类所在的包起一层一层向上搜索,直到找到一个@SpringBootApplication或@SpringBootConfiguration注释类为止。以此来确定如何装载 Spring 应用程序的上下文资源。
B. 基于 Spring 环境的 Junit 集成测试还需要使@RunWith(SpringJUnit4ClassRunner.class)注解,该注解能够改变 Junit 并让其运行在 Spring 的测试环境,以得到 Spring 测试环境的上下文支持。否则,在 Junit 测试中,Bean 的自动装配等注解将不起作用。但由于 SpringJUnit4ClassRunner 不方便记忆,Spring 4.3 起提供了一个等同于 SpringJUnit4ClassRunner 的类 SpringRunner,因此可以简写成:@RunWith(SpringRunner.class)。
7判断字符串是否为空
****不要用 if(token == null || “”.equals(token.trim())){ trim ()效率很低
****推荐用 工具类 StringUtils.isBlank(token)和isNotBlank(token)
包 org.apache.commons.lang
if(StringUtils.isBlank(access-token)){**
// 没有access-token,登录校验失败,拦截
//********
}
//@return true
if the String is null, empty or whitespace
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}