Java 如何编写junit mokito测试用例
如何使用if-else条件示例为绑定结果Java 如何编写junit mokito测试用例,java,spring-mvc,junit,mockito,Java,Spring Mvc,Junit,Mockito,如何使用if-else条件示例为绑定结果@Valid功能编写Junit、Mockito测试用例 @RequestMapping(value = "/scriptfile", method = RequestMethod.POST) public String create( @Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap ) { if (s
@Valid
功能编写Junit、Mockito测试用例
@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)
public String create(
@Valid ScriptFile scriptFile,
BindingResult result,
ModelMap modelMap
)
{
if (scriptFile == null)
throw new IllegalArgumentException("A scriptFile is required");
if (result.hasErrors()) {
modelMap.addAttribute("scriptFile", scriptFile);
modelMap.addAttribute("showcases", ShowCase.findAllShowCases());
return "scriptfile/create";
}
scriptFile.persist();
return "redirect:/scriptfile/" + scriptFile.getId();
}
如何为上述示例编写Junitm Mockito测试用例?我将使用Mockito模拟绑定结果和脚本文件类:
@Test
public void create_WithErrors(){
BindingResult bindingResult = Mockito.mock(BindingResult.class);
BindingResult scriptFile = Mockito.mock(ScriptFile.class);
Mockito.when(bindingResult.hasErrors()).thenReturn(true);
String result = create(scriptFile, bindingResult, new ModelMap());
Mockito.verify(bindingResult.hasErrors());
Mockito.verify(scriptFile .persist(), Mockito.never());
assertThat(result, is(equalTo("scriptfile/create")))
}
会是这样的。如果可以实例化对象,则可以使用spy而不是mock。或者甚至创建一个
ModelMap
实例,并检查属性设置是否正确,而不是模拟
@Mock
private BindingResult result;
@Mock
private ModelMap modelMap;
@Mock
private ScriptFile scriptFile;
@BeforeMethod
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
@Test(expectedExceptions = {IllegalArgumentException.class})
public void shouldThrowIllegalArgumentException() {
create(null, result, modelMap);
}
@Test
public void shouldPersistFile() {
Mockito.when(result.hasErrors()).thenReturn(false);
Mockito.when(scriptFile.getId()).thenReturn("FILE_ID");
String output = create(scriptFile, result, modelMap);
Mockito.verify(scriptFile, times(1)).persist();
assertEquals("redirect:/scriptfile/FILE_ID", output)
}
@Test
public void shouldHandleErrors() {
Mockito.when(result.hasErrors()).thenReturn(true);
Mockito.when(scriptFile.getId()).thenReturn("FILE_ID");
String output = create(scriptFile, result, modelMap);
Mockito.verify(modelMap, times(2)).addAttribute(Mockito.any(), Mockito.any());
assertEquals("scriptfile/create", output)
}
使用spring test MockMvC,现有代码很多,其中之一是: 并且您的代码段不工作,您没有绑定参数(@RequestParam)
这里是mockito测试的一个示例,使用@PostMapping代替@RequestMapping
package com.ase.PRODUCTS.mockito.service;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ase.PRODUCTS.bean.AuthenticationStatus;
import com.ase.PRODUCTS.bean.SignUpStatus;
import com.ase.PRODUCTS.bean.User;
import com.ase.PRODUCTS.dao.UserDao;
import com.ase.PRODUCTS.repository.UserRepository;
import com.ase.PRODUCTS.service.UserService;
public class UserServiceTest {
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceTest.class);
@Mock
UserRepository mockedUserRepository;
// UserDao mockedUserDao;
@InjectMocks
UserService service;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
}
@Test
public void signUpNewUser() {
LOGGER.info("START : Inside Unit Testing addUser() method of UserServiceTest");
User user = new User();
user.setEmail("kiran@gmail.com");
LOGGER.debug("User Object : {}", user);
when(mockedUserRepository.findUserByEmail(user.getEmail())).thenReturn(null);
SignUpStatus expectedStatus = new SignUpStatus(true, false);
SignUpStatus actualStatus = service.addUser(user);
LOGGER.debug("Expected Output : {}", expectedStatus);
LOGGER.debug("Actual Output : {}", actualStatus);
Assert.assertEquals(true, expectedStatus.equals(actualStatus));
verify(mockedUserRepository, times(1)).save(Mockito.any(User.class));
verify(mockedUserRepository, times(1)).findUserByEmail(user.getEmail());
LOGGER.info("End : Unit Testing addUser() method of UserServiceTest");
}
@Test
public void emailAlreadyExists() {
LOGGER.info("START : Inside Unit Testing addUser() method of UserServiceTest");
User user = new User();
user.setEmail("kiran@gmail.com");
LOGGER.debug("User Object : {}", user);
when(mockedUserRepository.findUserByEmail(user.getEmail())).thenReturn(user);
SignUpStatus expectedStatus = new SignUpStatus(false, true);
SignUpStatus actualStatus = service.addUser(user);
LOGGER.debug("Expected Output : {}", expectedStatus);
LOGGER.debug("Actual Output : {}", actualStatus);
Assert.assertEquals(true, expectedStatus.equals(actualStatus));
verify(mockedUserRepository, times(0)).save(Mockito.any(User.class));
verify(mockedUserRepository, times(1)).findUserByEmail(user.getEmail());
LOGGER.info("End : Unit Testing addUser() method of UserServiceTest");
}
@Test
public void loginValidUser() {
LOGGER.info("START : Inside Unit Testing addUser() method of UserServiceTest");
User user = new User();
user.setEmail("kiran@gmail.com");
user.setPassword("123456");
LOGGER.debug("User Object : {}", user);
when(mockedUserRepository.findUserByEmail(user.getEmail())).thenReturn(user);
AuthenticationStatus expectedStatus = new AuthenticationStatus();
expectedStatus.setAuthenticated(true);
expectedStatus.setActualUser(user);
AuthenticationStatus actualStatus = service.loginUser(user);
LOGGER.debug("Expected Output : {}", expectedStatus);
LOGGER.debug("Actual Output : {}", actualStatus);
Assert.assertEquals(true, expectedStatus.equals(actualStatus));
verify(mockedUserRepository, times(0)).save(Mockito.any(User.class));
verify(mockedUserRepository, times(1)).findUserByEmail(user.getEmail());
LOGGER.info("End : Unit Testing addUser() method of UserServiceTest");
}
@Test
public void testLoginForInvalidEmail() {
LOGGER.info("START : Inside Unit Testing addUser() method of UserServiceTest");
User user = new User();
user.setEmail("kiran@gmail.com");
user.setPassword("123456");
LOGGER.debug("User Object : {}", user);
AuthenticationStatus expectedStatus = new AuthenticationStatus();
expectedStatus.setAuthenticated(false);
expectedStatus.setActualUser(null);
User actualUser = new User();
actualUser.setEmail("kiran.com");
actualUser.setPassword("123456");
when(mockedUserRepository.findUserByEmail(user.getEmail())).thenReturn(actualUser);
AuthenticationStatus actualStatus = service.loginUser(user);
LOGGER.debug("Expected Output : {}", expectedStatus);
LOGGER.debug("Actual Output : {}", actualStatus);
Assert.assertEquals(true, expectedStatus.equals(actualStatus));
verify(mockedUserRepository, times(1)).findUserByEmail(user.getEmail());
LOGGER.info("End : Unit Testing addUser() method of UserServiceTest");
}
@Test
public void testLoginForInvalidPassword() {
LOGGER.info("START : Inside Unit Testing addUser() method of UserServiceTest");
User user = new User();
user.setEmail("kiran@gmail.com");
user.setPassword("123456");
LOGGER.debug("User Object : {}", user);
AuthenticationStatus expectedStatus = new AuthenticationStatus();
expectedStatus.setAuthenticated(false);
expectedStatus.setActualUser(null);
User actualUser = new User();
actualUser.setEmail("kiran@gmail.com");
actualUser.setPassword("1256");
when(mockedUserRepository.findUserByEmail(user.getEmail())).thenReturn(actualUser);
AuthenticationStatus actualStatus = service.loginUser(user);
LOGGER.debug("Expected Output : {}", expectedStatus);
LOGGER.debug("Actual Output : {}", actualStatus);
Assert.assertEquals(true, expectedStatus.equals(actualStatus));
verify(mockedUserRepository, times(1)).findUserByEmail(user.getEmail());
LOGGER.info("End : Unit Testing addUser() method of UserServiceTest");
}
}
我会:A)使用@Mock,而不是在before方法中调用Mock()。B) 一定要符合他的榜样。create()接受3个参数,而不是1个!C) 强调目标必须是1)测试方法的公共契约,2)除此之外,测试生产类中的所有路径。最后:我想知道是否真的需要模拟ModelMap。只有当“普通”实现无法使用时,才可以模拟对象。我希望可以简单地传入一个映射并进行相应的配置。谢谢,我只是从内存中编写它,而没有使用IDE进行验证:)。我也不认为ModelMap应该被嘲笑,但是如果没有完整的代码,我就是说不出来。