Java Mockito和string对象

Java Mockito和string对象,java,junit,mockito,Java,Junit,Mockito,我今天开始和莫基托玩了,我遇到了一个问题。这是我试图创建测试用例的类: @Path("search") public class SearchWebService { private static final Logger logger = Logger.getLogger(SearchWebService.class); @EJB UserServiceInterface userService; @GET @Path("/json/{searchstring}") @Produces(

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

@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抛出一个异常,说“cannotmock/spy class 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);
}
公共类SearchWebService测试{
@嘲弄
用户服务接口mockedUserService;
@嘲弄
记录器模拟记录器;
@嘲弄
HttpServletRequestMockedRequest;
@嘲弄
字符串mockedString;
@嘲弄
列表模拟用户列表;
@以前
public void setUp()引发异常{
initMocks(this);
}
@试验
public void testGetJSONFromSearchResultsSpace()引发异常{
当(mockedRequest.getRemoteUser())。然后返回(“电子邮件”);
当(“StringWithSpace.”包含(“”)时,返回(true);
当(“StringWitchSpace.split(\\s+”,2))。然后返回(null);
when(mockedUserService.searchByFullName(“name1”、“name2”、“email”))。然后返回(mockedUserList);
assertTrue(mockedUserList.size()>0);
}

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

你可以参考这个链接


我希望它有帮助!!!

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

你可以参考这个链接


我希望它有帮助!!!

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

你可以参考这个链接


我希望它有帮助!!!

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

你可以参考这个链接


我希望这会有帮助!!!

如果你需要用一个有空格的字符串来调用你的服务,那么只需给它传递一个有空格的字符串。不要模拟你要测试的类。你应该在单元测试中尽可能少地模拟。只需提供满足特定测试特定条件的真实输入数据。仅模拟协作者,并且仅在需要时。如果需要字符串(作为参数或协作者的返回值)如果满足某些条件,则只需提供这样一个示例字符串。

如果您需要使用一个有空格的字符串调用服务,则只需向其传递一个有空格的字符串。并且不要模拟您尝试测试的类。您应该在单元测试中尽可能少地模拟。只需提供满足p特定测试的特定条件。仅限模拟协作者,并且仅在需要时。如果需要字符串(作为参数或协作者的返回值)如果满足某些条件,则只需提供这样一个示例字符串。

如果您需要使用一个有空格的字符串调用服务,则只需向其传递一个有空格的字符串。并且不要模拟您尝试测试的类。您应该在单元测试中尽可能少地模拟。只需提供满足p特定测试的特定条件。仅限模拟协作者,并且仅在需要时。如果需要字符串(作为参数或协作者的返回值)如果满足某些条件,则只需提供这样一个示例字符串。

如果您需要使用一个有空格的字符串调用服务,则只需向其传递一个有空格的字符串。并且不要模拟您尝试测试的类。您应该在单元测试中尽可能少地模拟。只需提供满足p特定测试的特定条件。仅限模拟协作者,并且仅在需要时。如果需要字符串(作为参数或协作者的返回值)若满足某些条件,则只需提供这样一个示例字符串。

所以,若需要对字符串测试某些方法,最好的方法是使用反射方法为字符串变量赋值。 我使用了apache公共库


writeField(您的类,“variableName”,“value”,true);

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


writeField(您的类,“variableName”,“value”,true);

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


writeField(您的类,“variableName”,“value”,true);

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



FieldUtils.writeField(您的类,“variableName”,“value”,true);

是否试图模拟.contains()的操作?是的,尝试模拟字符串对象,现在直接在when方法中模拟字符串。不起作用。我也是测试新手,所以可能已经有了模拟字符串方法的特定方法。你到底想测试什么?对我来说,在理解模拟框架的使用方面似乎存在问题。你的断言是在模拟对象上t、 Mocking是为了模拟不需要的依赖项,并测试一些真实的代码。请注意@Aritra和她的注释。在任何情况下都不应该模拟Java字符串——永远不要。只需使用真实的字符串。您是否试图模拟.contains()的操作?是的,尝试模拟字符串对象,现在直接在when方法中模拟字符串。不起作用。我也是测试新手,所以可能已经有了模拟字符串方法的特定方法。你到底想测试什么?对我来说,在理解模拟框架的使用方面似乎存在问题。你的断言是在模拟对象上t、 模拟是为了模拟不需要的依赖项