流水线的单元测试 代码没有覆盖到,使用的是Mockito测试框架,原来是Mockito没有正确使用
package com.hmdp;
import com.hmdp.controller.BlogController;
import com.hmdp.entity.Blog;
import com.hmdp.service.IBlogService;
import com.hmdp.service.impl.BlogServiceImpl;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.springframework.boot.test.context.SpringBootTest;
/**
* @Author: ldj
* @Date: 2023/07/05/20:39
* @Description: Mockito 测试案例
*/
@RunWith(MockitoJUnitRunner.class)
@SpringBootTest
public class MockitoTest {
//我是主对象
@InjectMocks
private BlogController blogController = new BlogController();
//我是依赖对象,将被注入到主对象
@Mock
private IBlogService blogService = new BlogServiceImpl();
@Test
public void saveBlogTest(){
Blog blog = new Blog();
blog.setId(4657558585L);
blog.setName("java入门到进阶");
blogController.saveBlog(blog);
}
}
后续补充:
package com.dj.springtest.mock;
/**
* User: ldj
* Date: 2023/7/17
* Time: 23:38
* Description: No Description
*/
public class MockService {
public int add(int a, int b) {
return a + b;
}
}
package com.dj.springtest.mock;
/**
* User: ldj
* Date: 2023/7/17
* Time: 23:48
* Description: No Description
*/
public interface IMockService {
default String write(Integer num) {
if (num != null && num == 1) {
return "hello i am Mockito";
} else {
return "big error";
}
}
}
package com.dj.springtest.mockitoTest;
import com.dj.springtest.mock.IMockService;
import com.dj.springtest.mock.MockService;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
/**
* User: ldj
* Date: 2023/7/17
* Time: 23:41
* Description: No Description
*/
//@RunWith(MockitoJUnitRunner.class)
public class MockServiceTest {
@Spy //默认使用无参构造创建对象,没有需要显性手动new有参构造器
private MockService mockService1 = new MockService(0);
@Mock
private MockService mockService2;
@Spy //这是接口默认方法
private IMockService iMockService;
@Before
public void setUp(){
//junit新版是openMock(),而且注解名称是@BeforeEach
//该方法可由@RunWith(MockitoJUnitRunner.class)代替,省去不写
System.out.println("-------测试开始-------");
MockitoAnnotations.initMocks(this);
}
@After
public void end(){
System.out.println("-------测试结束-------");
}
@Test
public void add1(){
System.out.println(mockService1.addition(1, 1)); //真实值2
Assert.assertEquals(2, mockService1.addition(1, 1));
}
@Test
public void add2(){
System.out.println(mockService2.addition(1, 1)); //初始值0
Assert.assertEquals(0, mockService2.addition(1, 1));
}
//结论: @Spy调用真实方法,而 @Mock只是一个虚拟对象不具备方法行为
@Test
public void write(){
System.out.println(iMockService.write(1));
//Mockito.when(iMockService.write(1)).thenReturn("Mockito"); 打桩定义返回值,断言将报错
Assert.assertEquals("hello i am Mockito", iMockService.write(1));
}
@Test
public void division(){
//模拟抛出异常
Mockito.when(mockService1.division(6, 5)).thenThrow(ArithmeticException.class);
//@Mock对象模拟走真实方法
Mockito.when(mockService2.division(6, 2)).thenCallRealMethod();
Assert.assertEquals(mockService1.division(6, 2), mockService2.division(6, 2));
}
}
后续补充: if分支里面的判断,代码无法覆盖问题,如果是参数问题