小技巧集锦01

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文件修改却没有触发自动重写载入。
此时需要手动强制更新依赖:

  1. 手动删除Project Setting 里面的libraries 包

  2. 在Maven Project点击clean功能,删除之前编译过得文件

在这里插入图片描述

  1. 项目右键 --》 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;
    }
发布了20 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u010565545/article/details/96384569