如何写一个JUnit测试的Mockito情况

问题描述 投票:1回答:4

如何写一个JUnit中,测试的Mockito的情况下与如果其他条件例如结合的结果@Valid功能?

@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情况下上面的例子?

java spring-mvc junit mockito
4个回答
1
投票

它会是这样的。你可以使用间谍,而不是模仿,如果你能实例化一个对象。甚至创造一个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)
}

0
投票

我会使用到的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")))
}

0
投票

使用弹簧试验MockMvC,有大量的现有代码,其中之一是:

Using Spring MVC Test to unit test multipart POST request

和您的代码段不能正常工作,你是不是绑定PARAMS(@RequestParam)也代替@RequestMapping使用@PostMapping


0
投票

以下是测试的Mockito一个例子。

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("[email protected]");
        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("[email protected]");
        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("[email protected]");
        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("[email protected]");
        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("[email protected]");
        user.setPassword("123456");
        LOGGER.debug("User Object :  {}", user);

        AuthenticationStatus expectedStatus = new AuthenticationStatus();
        expectedStatus.setAuthenticated(false);
        expectedStatus.setActualUser(null);

        User actualUser = new User();
        actualUser.setEmail("[email protected]");
        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");
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.