Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何编写junit mokito测试用例_Java_Spring Mvc_Junit_Mockito - Fatal编程技术网

Java 如何编写junit mokito测试用例

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

如何使用if-else条件示例为绑定结果
@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应该被嘲笑,但是如果没有完整的代码,我就是说不出来。