【问题标题】:Mockito and string objectsMockito 和字符串对象
【发布时间】:2023-03-15 04:00:01
【问题描述】:

我今天开始玩 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 抛出一个异常说 "Cannot mock/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);
}

【问题讨论】:

  • 你想模拟 .contains() 的操作吗?
  • 是的,尝试在 when 方法中直接模拟 String 对象和现在的字符串。不工作。我也是测试新手,所以也许已经有一种特定的方法来模拟 String 方法。
  • 你到底想测试什么?
  • 对我来说,在使用模拟框架的理解上似乎存在问题。您的断言是在一个模拟对象上。模拟是为了模拟不需要的依赖项,并测试一些真实的代码。见:stackoverflow.com/questions/2665812/what-is-mocking
  • 请关注@Aritra 和她的cmets。在任何情况下,您都不应该模拟 Java 字符串——永远。只需使用真正的字符串。

标签: java junit mockito


【解决方案1】:

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

你可以参考这个链接。

Mockito Verification Not Failing

希望对你有帮助!!!

【讨论】:

  • 但是我应该如何测试 searchString.contains(" ") 条件?
  • 你可以使用 PawerMock 来模拟 final 类
  • 您不应该测试方法 String#contains()。测试它基本上是测试 Java 没有损坏。您最好期望 Java 字符串不会损坏。
  • 现在你可以使用 mockito 2.1
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      相关资源
      最近更新 更多