在单元测试中是否有替代模拟对象的方法?

时间:2010-01-08 18:58:52

标签: java unit-testing junit

这是一个Java(使用JUnit)企业Web应用程序,没有预先构建的模拟对象,并且需要花费大量时间来估计它们。是否有测试范例可以给我“一些”测试覆盖率,但不是总覆盖率?

7 个答案:

答案 0 :(得分:6)

您是否尝试过动态模拟框架,例如EasyMock?它不需要你“创建”Mock对象,因为你必须编写整个类 - 你在测试本身中指定你想要的行为。

使用UserService查找用户详细信息以便记录某人的类的示例:

//Tests what happens when a username is found in the backend
public void testLoginSuccessful() {
    UserService mockUserService = EasyMock.createMock(UserService.class);

    EasyMock.expect(mockUserService.getUser("aUsername")).andReturn(new User(...));
    EasyMock.replay(mockUserService);

    classUnderTest.setUserService(mockUserService);

    boolean isLoggedIn = classUnderTest.login("username");
    assertTrue(isLoggedIn);
}

//Tests what happens when the user does not exist
public void testLoginFailure() {
    UserService mockUserService = EasyMock.createMock(UserService.class);

    EasyMock.expect(mockUserService.getUser("aUsername")).andThrow(new UserNotFoundException());
    EasyMock.replay(mockUserService);

    classUnderTest.setUserService(mockUserService);

    boolean isLoggedIn = classUnderTest.login("username");
    assertFalse(isLoggedIn);
}

答案 1 :(得分:3)

(1)单元测试(和模拟)的替代方案包括集成测试(使用dbUnit)和FIT测试。有关更多信息,请see my answer here

(2)模拟框架Mockito非常出色。你不必“预先建立”任何模拟。引入项目相对容易。

答案 2 :(得分:1)

我会回应其他人对EasyMock的看法。但是,如果你有一个代码库,你需要模拟静态方法调用,最终类或方法等等,那么给JMockit看看。

答案 3 :(得分:1)

嗯,如果不是最简单的方法,获得高水平的代码覆盖率就是按照测试驱动开发(TDD)编写代码测试优先。现在代码存在,没有单元测试,它可以被视为遗留代码。

你可以编写端到端测试,在你的应用程序外部,那些不是单元测试,但它们可以编写而不需要任何类型的模拟。或者你可以编写跨越多个类的单元测试,并且只模拟阻碍单元测试的类。

答案 4 :(得分:0)

您是否拥有可导入测试平台的真实世界数据,以用作快速的“模拟对象”

答案 5 :(得分:0)

我认为相反的情况很难 - 找到一种测试方法,可以在大多数情况下为您提供全面覆盖。

答案 6 :(得分:0)

您应该尝试EasyMock