2 集成SpringMVC项目
<dependency> <groupId>junitgroupId> <artifactId>junitartifactId> <version>4.12version> <scope>testscope>dependency>
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-testartifactId> <scope>testscope>dependency>
public class ListTest { @Test public void testSize() { Integer expected = 100; List list = PowerMockito.mock(List.class); PowerMockito.when(list.size()).thenReturn(expected); Integer actual = list.size(); Assert.assertEquals("返回值不相等", expected, actual); }}
声明:
T PowerMockito.mock(Class clazz);
@RunWith(PowerMockRunner.class)@PrepareForTest({TargetClass.class})
public class RectangleTest { @Test public void testGetArea() { double expectArea = 100.0D; Rectangle rectangle = PowerMockito.mock(Rectangle.class); PowerMockito.when(rectangle.getArea()).thenReturn(expectArea); double actualArea = rectangle.getArea(); Assert.assertEquals("返回值不相等", expectArea, actualArea, 1E-6D); }}
@Getter@Setter@ToStringpublic final class Circle { private double radius; public double getArea() { return Math.PI * Math.pow(radius, 2); }}
@RunWith(PowerMockRunner.class)@PrepareForTest({Circle.class})public class CircleTest { @Test public void testGetArea() { double expectArea = 3.14D; Circle circle = PowerMockito.mock(Circle.class); PowerMockito.when(circle.getArea()).thenReturn(expectArea); double actualArea = circle.getArea(); Assert.assertEquals("返回值不相等", expectArea, actualArea, 1E-6D); }}
@RunWith(PowerMockRunner.class)@PrepareForTest({Circle.class})public class CircleTest { @Test public void testGetArea() { double expectArea = 3.14D; Circle circle = PowerMockito.mock(Circle.class); PowerMockito.when(circle.getArea()).thenReturn(expectArea); double actualArea = circle.getArea(); Assert.assertEquals("返回值不相等", expectArea, actualArea, 1E-6D); }}
PowerMockito.mockStatic(Class clazz);
PowerMockito.spy(Class clazz);
@RunWith(PowerMockRunner.class)@PrepareForTest({StringUtils.class})public class StringUtilsTest { @Test public void testIsNotEmpty() { String string = null; boolean expected = true; PowerMockito.spy(StringUtils.class); PowerMockito.when(StringUtils.isEmpty(string)).thenReturn(!expected); boolean actual = StringUtils.isNotEmpty(string); Assert.assertEquals("返回值不相等", expected, actual); }}
T PowerMockito.spy(T object);
@RunWith(PowerMockRunner.class)@PrepareForTest({StringUtils.class})public class StringUtilsTest { @Test public void testIsNotEmpty() { String string = null; boolean expected = true; PowerMockito.spy(StringUtils.class); PowerMockito.when(StringUtils.isEmpty(string)).thenReturn(!expected); boolean actual = StringUtils.isNotEmpty(string); Assert.assertEquals("返回值不相等", expected, actual); }}
PowerMockito.when(mockObject.someMethod(someArgs)).thenReturn(expectedValue);PowerMockito.when(mockObject.someMethod(someArgs)).thenThrow(expectedThrowable);PowerMockito.when(mockObject.someMethod(someArgs)).thenAnswer(expectedAnswer);PowerMockito.when(mockObject.someMethod(someArgs)).thenCallRealMethod();
public class ListTest { @Test(expected = IndexOutOfBoundsException.class) public void testGet() { int index = -1; Integer expected = 100; List mockList = PowerMockito.mock(List.class); PowerMockito.when(mockList.get(index)).thenThrow(new IndexOutOfBoundsException()); Integer actual = mockList.get(index); Assert.assertEquals("返回值不相等", expected, actual); }}
public class ListTest { @Test public void testGet() { int index = 1; Integer expected = 100; List mockList = PowerMockito.mock(List.class); PowerMockito.when(mockList.get(index)).thenAnswer(invocation -> { Integer value = invocation.getArgument(0); return value * 100; }); Integer actual = mockList.get(index); Assert.assertEquals("返回值不相等", expected, actual); }}
public class ListTest { @Test public void testGet() { int index = 0; Integer expected = 100; List oldList = new ArrayList<>(); oldList.add(expected); List spylist = PowerMockito.spy(oldList); PowerMockito.when(spylist.get(index)).thenCallRealMethod(); Integer actual = spylist.get(index); Assert.assertEquals("返回值不相等", expected, actual); }}
PowerMockito.doReturn(expectedValue).when(mockObject).someMethod(someArgs);PowerMockito.doThrow(expectedThrowable).when(mockObject).someMethod(someArgs);PowerMockito.doAnswer(expectedAnswer).when(mockObject).someMethod(someArgs);PowerMockito.donothing().when(mockObject).someMethod(someArgs);PowerMockito.doCallRealMethod().when(mockObject).someMethod(someArgs);
PowerMockito.doReturn(expectedValue).when(mockObject.someMethod(someArgs));PowerMockito.doThrow(expectedThrowable).when(mockObject.someMethod(someArgs));PowerMockito.doAnswer(expectedAnswer).when(mockObject.someMethod(someArgs));PowerMockito.donothing().when(mockObject.someMethod(someArgs));PowerMockito.doCallRealMethod().when(mockObject.someMethod(someArgs));
public class ListTest { @Test(expected = IndexOutOfBoundsException.class) public void testGet() { int index = -1; Integer expected = 100; List mockList = PowerMockito.mock(List.class); PowerMockito.doThrow(new IndexOutOfBoundsException()).when(mockList).get(index); Integer actual = mockList.get(index); Assert.assertEquals("返回值不相等", expected, actual); }}
public class ListTest { @Test(expected = IndexOutOfBoundsException.class) public void testGet() { int index = -1; Integer expected = 100; List mockList = PowerMockito.mock(List.class); PowerMockito.doThrow(new IndexOutOfBoundsException()).when(mockList).get(index); Integer actual = mockList.get(index); Assert.assertEquals("返回值不相等", expected, actual); }}
public class ListTest { @Test public void testGet() { int index = 1; Integer expected = 100; List mockList = PowerMockito.mock(List.class); PowerMockito.doAnswer(invocation -> { Integer value = invocation.getArgument(0); return value * 100; }).when(mockList).get(index); Integer actual = mockList.get(index); Assert.assertEquals("返回值不相等", expected, actual); }}
public class ListTest { @Test public void testGet() { int index = 0; Integer expected = 100; List oldList = new ArrayList<>(); oldList.add(expected); List spylist = PowerMockito.spy(oldList); PowerMockito.doCallRealMethod().when(spylist).get(index); Integer actual = spylist.get(index); Assert.assertEquals("返回值不相等", expected, actual); }}
@Slf4j@Servicepublic class UserService { public long getUserCount() { log.info("调用获取用户数量方法"); return 0L; }}
@RunWith(PowerMockRunner.class)public class UserServiceTest { @Test public void testGetUserCount() { Long expected = 1000L; UserService userService = PowerMockito.spy(new UserService()); PowerMockito.when(userService.getUserCount()).thenReturn(expected); Long actual = userService.getUserCount(); Assert.assertEquals("返回值不相等", expected, actual); }}
@RunWith(PowerMockRunner.class)public class UserServiceTest { @Test public void testGetUserCount() { Long expected = 1000L; UserService userService = PowerMockito.spy(new UserService()); PowerMockito.doReturn(expected).when(userService).getUserCount(); Long actual = userService.getUserCount(); Assert.assertEquals("返回值不相等", expected, actual); }}
PowerMockito.whenNew(MockClass.class).withNoArguments().thenReturn(expectedObject);PowerMockito.whenNew(MockClass.class).withArguments(someArgs).thenReturn(expectedObject);
@RunWith(PowerMockRunner.class)@PrepareForTest({FileUtils.class})public class FileUtilsTest { @Test public void testIsFile() throws Exception { String fileName = "test.txt"; File file = PowerMockito.mock(File.class); PowerMockito.whenNew(File.class).withArguments(fileName).thenReturn(file); PowerMockito.when(file.isFile()).thenReturn(true); Assert.assertTrue("返回值为假", FileUtils.isFile(fileName)); }}
public class ListTest { @Test public void testGet() { int index = 1; Integer expected = 100; List mockList = PowerMockito.mock(List.class); PowerMockito.when(mockList.get(Mockito.anyInt())).thenReturn(expected); Integer actual = mockList.get(index); Assert.assertEquals("返回值不相等", expected, actual); }}
@RunWith(PowerMockRunner.class)@PrepareForTest({StringUtils.class})public class StringUtilsTest { @Test public void testStartWith() { String string = "abc"; String prefix = "b"; boolean expected = true; PowerMockito.spy(StringUtils.class); PowerMockito.when(StringUtils.startsWith(Mockito.anyString(), Mockito.eq(prefix))).thenReturn(expected); boolean actual = StringUtils.startsWith(string, prefix); Assert.assertEquals("返回值不相等", expected, actual); }}
public class ListTest { @Test public void testGet() { int index = 1; Integer expected = 100; List mockList = PowerMockito.mock(List.class); PowerMockito.when(mockList.get(AdditionalMatchers.geq(0))).thenReturn(expected); PowerMockito.when(mockList.get(AdditionalMatchers.lt(0))).thenThrow(new IndexOutOfBoundsException()); Integer actual = mockList.get(index); Assert.assertEquals("返回值不相等", expected, actual); }}
Mockito.verify(mockObject[,times(int)]).someMethod(somgArgs);
public class ListTest { @Test public void testGet() { List mockList = PowerMockito.mock(List.class); PowerMockito.donothing().when(mockList).clear(); mockList.clear(); Mockito.verify(mockList, Mockito.times(1)).clear(); }}
public class ListTest { @Test public void testAdd() { List mockedList = PowerMockito.mock(List.class); PowerMockito.doReturn(true).when(mockedList).add(Mockito.anyInt()); mockedList.add(1); mockedList.add(2); mockedList.add(3); InOrder inOrder = Mockito.inOrder(mockedList); inOrder.verify(mockedList).add(1); inOrder.verify(mockedList).add(2); inOrder.verify(mockedList).add(3); }}
public class ListTest { @Test public void testArgumentCaptor() { Integer[] expecteds = new Integer[] {1, 2, 3}; List mockedList = PowerMockito.mock(List.class); PowerMockito.doReturn(true).when(mockedList).add(Mockito.anyInt()); for (Integer expected : expecteds) { mockedList.add(expected); } ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Integer.class); Mockito.verify(mockedList, Mockito.times(3)).add(argumentCaptor.capture()); Integer[] actuals = argumentCaptor.getAllValues().toArray(new Integer[0]); Assert.assertArrayEquals("返回值不相等", expecteds, actuals); }}
public class ListTest { @Test public void testVerifyNoMoreInteractions() { List mockedList = PowerMockito.mock(List.class); Mockito.verifyNoMoreInteractions(mockedList); // 执行正常 mockedList.isEmpty(); Mockito.verifyNoMoreInteractions(mockedList); // 抛出异常 }}
@RunWith(PowerMockRunner.class)@PrepareForTest({StringUtils.class})public class StringUtilsTest { @Test public void testVerifyStatic() { PowerMockito.mockStatic(StringUtils.class); String expected = "abc"; StringUtils.isEmpty(expected); PowerMockito.verifyStatic(StringUtils.class); ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(String.class); StringUtils.isEmpty(argumentCaptor.capture()); Assert.assertEquals("参数不相等", argumentCaptor.getValue(), expected); }}
@Servicepublic class UserService { @Value("${system.userLimit}") private Long userLimit; public Long getUserLimit() { return userLimit; }}
public class UserServiceTest { @Autowired private UserService userService; @Test public void testGetUserLimit() { Long expected = 1000L; ReflectionTestUtils.setField(userService, "userLimit", expected); Long actual = userService.getUserLimit(); Assert.assertEquals("返回值不相等", expected, actual); }}
public class UserServiceTest { @Autowired private UserService userService; @Test public void testGetUserLimit() { Long expected = 1000L; ReflectionTestUtils.setField(userService, "userLimit", expected); Long actual = userService.getUserLimit(); Assert.assertEquals("返回值不相等", expected, actual); }}
@Servicepublic class UserService { @Value("${system.userLimit}") private Long userLimit; public Long getUserLimit() { return userLimit; }}
@RunWith(PowerMockRunner.class)public class UserServiceTest { @InjectMocks private UserService userService; @Test public void testGetUserLimit() { Long expected = 1000L; Whitebox.setInternalState(userService, "userLimit", expected); Long actual = userService.getUserLimit(); Assert.assertEquals("返回值不相等", expected, actual); }}
@RunWith(PowerMockRunner.class)public class UserServiceTest { @InjectMocks private UserService userService; @Test public void testGetUserLimit() { Long expected = 1000L; Whitebox.setInternalState(userService, "userLimit", expected); Long actual = userService.getUserLimit(); Assert.assertEquals("返回值不相等", expected, actual); }}
public class UserService { private Long superUserId; public boolean isNotSuperUser(Long userId) { return !isSuperUser(userId); } private boolean isSuperUser(Long userId) { return Objects.equals(userId, superUserId); }}
@RunWith(PowerMockRunner.class)@PrepareForTest({UserService.class})public class UserServiceTest { @Test public void testIsNotSuperUser() throws Exception { Long userId = 1L; boolean expected = false; UserService userService = PowerMockito.spy(new UserService()); PowerMockito.when(userService, "isSuperUser", userId).thenReturn(!expected); boolean actual = userService.isNotSuperUser(userId); Assert.assertEquals("返回值不相等", expected, actual); }}
@RunWith(PowerMockRunner.class)@PrepareForTest({UserService.class})public class UserServiceTest { @Test public void testIsNotSuperUser() throws Exception { Long userId = 1L; boolean expected = false; UserService userService = PowerMockito.spy(new UserService()); PowerMockito.when(userService, "isSuperUser", userId).thenReturn(!expected); boolean actual = userService.isNotSuperUser(userId); Assert.assertEquals("返回值不相等", expected, actual); }}
@RunWith(PowerMockRunner.class)@PrepareForTest({UserService.class})public class UserServiceTest { @Test public void testIsNotSuperUser() throws Exception { Long userId = 1L; boolean expected = false; UserService userService = PowerMockito.spy(new UserService()); PowerMockito.stub(PowerMockito.method(UserService.class, "isSuperUser", Long.class)).toReturn(!expected); boolean actual = userService.isNotSuperUser(userId); Assert.assertEquals("返回值不相等", expected, actual; }}
@RunWith(PowerMockRunner.class)public class UserServiceTest9 { @Test public void testIsSuperUser() throws Exception { Long userId = 1L; boolean expected = false; UserService userService = new UserService(); Method method = PowerMockito.method(UserService.class, "isSuperUser", Long.class); Object actual = method.invoke(userService, userId); Assert.assertEquals("返回值不相等", expected, actual); }}
@RunWith(PowerMockRunner.class)@PrepareForTest({UserService.class})public class UserServiceTest10 { @Test public void testIsNotSuperUser() throws Exception { Long userId = 1L; boolean expected = false; UserService userService = PowerMockito.spy(new UserService()); PowerMockito.when(userService, "isSuperUser", userId).thenReturn(!expected); boolean actual = userService.isNotSuperUser(userId); PowerMockito.verifyPrivate(userService).invoke("isSuperUser", userId); Assert.assertEquals("返回值不相等", expected, actual); }}
@RunWith(PowerMockRunner.class)
@PrepareForTest({ TargetClass.class })
@RunWith(PowerMockRunner.class)public class UserServiceTest { @Mock private UserDAO userDAO; @InjectMocks private UserService userService; @Test public void testCreateUser() { UserVO userVO = new UserVO(); userVO.setId(1L); userVO.setName("changyi"); userVO.setDesc("test user"); userService.modifyUser(userVO); ArgumentCaptor
@Servicepublic class UserService { @Autowired private UserDAO userDAO; public void modifyUser(UserVO userVO) { UserDO userDO = new UserDO(); BeanUtils.copyProperties(userVO, userDO); userDAO.modify(userDO); }}
@RunWith(PowerMockRunner.class)public class UserServiceTest { @Mock private UserDAO userDAO; @InjectMocks private UserService userService; @Captor private ArgumentCaptor argumentCaptor; @Before public void beforeTest() { MockitoAnnotations.openMocks(this); } @Test public void testCreateUser() { UserVO userVO = new UserVO(); userVO.setId(1L); userVO.setName("changyi"); userVO.setDesc("test user"); userService.modifyUser(userVO); Mockito.verify(userDAO).modify(argumentCaptor.capture()); UserDO userDO = argumentCaptor.getValue(); Assert.assertNotNull("用户实例为空", userDO); Assert.assertEquals("用户标识不相等", userVO.getId(), userDO.getId()); Assert.assertEquals("用户名称不相等", userVO.getName(), userDO.getName()); Assert.assertEquals("用户描述不相等", userVO.getDesc(), userDO.getDesc()); }}
@RunWith(PowerMockRunner.class)public class UserServiceTest { @Mock private UserDAO userDAO; @InjectMocks private UserService userService; @Captor private ArgumentCaptor
-
A:Automatic(自动化)
- I:Independent(独立性)
- R:Repeatable(可重复)
- B:Border,边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。
- C:Correct,正确的输入,并得到预期的结果。
- D:Design,与设计文档相结合,来编写单元测试。
- E:Error,强制错误信息输入(如:非法数据、异常流程、业务允许外等),并得到预期的结果。
来源:高德技术
作者:常意