Mockito 和字符串对象

Sam*_*deh 1 java junit mockito

我今天开始玩mockito,遇到了一个问题。这是我试图创建测试用例的类:

@Path("search")
public class SearchWebService {

private static final Logger logger = Logger.getLogger(SearchWebService.class);

@EJB
UserServiceInterface userService;

@GET
@Path("/json/{searchstring}")
@Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
@RolesAllowed("User")
public List getJSONFromSearchResults(@PathParam("searchstring") String searchString, @Context HttpServletRequest request) {
    logger.info("getJSONFromSearchResults called");

    //Users own email
    String ownemail = request.getRemoteUser();

    if (searchString.contains(" ")) {
        //Split String in two at first space
        String names[] = searchString.split("\\s+", 2);

        List userList = userService.searchByFullName(names[0], names[1], ownemail);
        if (userList.size() > 0) {
            return userList;
        } //Check for cases where the last name contains spaces
        else {
            return userService.searchByLastName(searchString, ownemail);
        }
    }
    return userService.searchBySingleName(searchString, ownemail);
}
}
Run Code Online (Sandbox Code Playgroud)

我在 searchString.contains(" ") 处,我试图调用“when(...).thenReturn(...)”,但是mockito抛出一个异常,说“不能模拟/间谍类java.lang。 String” 我不确定在测试此 Web 服务时是否正确执行。也许还有其他方法可以做到这一点?这是我的测试课:

public class SearchWebServiceTest {

@Mock
UserServiceInterface mockedUserService;
@Mock
Logger mockedLogger;
@Mock
HttpServletRequest mockedRequest;
@Mock
String mockedString;
@Mock
List<SearchResultsContainer> mockedUserList;

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

@Test
public void testGetJSONFromSearchResultsSpace() throws Exception {
    when(mockedRequest.getRemoteUser()).thenReturn("email");
    when("StringWithSpace".contains(" ")).thenReturn(true);
    when("StringWitchSpace".split("\\s+", 2)).thenReturn(null);
    when(mockedUserService.searchByFullName("name1", "name2", "email")).thenReturn(mockedUserList);
    assertTrue(mockedUserList.size() > 0);
}
Run Code Online (Sandbox Code Playgroud)

Dee*_*ava 5

你不能模拟最终类(如字符串)。这是该框架的已知限制。

你可以参考这个链接。

Mockito 验证未失败

我希望它有帮助!

  • 您不应该测试 String#contains() 方法。测试这一点基本上就是测试 Java 是否没有被破坏。您最好期望 Java 字符串不会损坏。 (2认同)