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);
}
}

我在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);
}

您不能模拟最终类(如String)。这是该框架的一个已知限制。

您可以参考此链接。

Mockito验证未通过

我希望它能有所帮助!!!

如果您需要用一个有空格的字符串调用服务,那么只需向它传递一个有空间的字符串。不要嘲笑你要测试的课程。在单元测试中,您应该尽可能少地进行模拟。只需提供符合特定测试特定条件的真实输入数据。只模拟合作者,而且只有在需要的时候。如果你需要一个符合某些条件的String(作为参数或作为合作者的返回值),那么只需提供这样一个示例String。

所以若您需要在字符串上测试某个方法,那个么最好的方法就是使用反射方法为字符串变量赋值。我使用了apache公共库进行

FieldUtils.writeField(yourClass,"variableName","value",true);

相关内容

  • 没有找到相关文章

最新更新