在 MVC 中测试 Facades |断言 Return 类型

Testing Facades in MVC | Assert Return Type

所以在一个 MVC 项目中,我有 Facades,它使用服务来获取信息。

所以我想通过我的测试确保调用正确的服务方法来获取信息,我想检查我的外观方法的 return 类型是否符合我的期望.

当然,当我期望一个用户列表时,例如我可以只模拟一个,然后使用 when().thenReturn() 到 return 列表并断言,输出是相同的

问题是,我觉得嘲笑一切都很烦人。下面是 Facade 中方法的示例:

public List<UserData> getUsersByRegion(final RegionModel userRegion)
    {
        final List<UserModel> userModels = userService.getUsersByRegion(userRegion);
        final List<UserData> userFacadeData = new ArrayList<UserData>();

        for (final userModel model : userModels)
        {
            final UserData userData = new UserData(model.getEmail());
            userFacadeData.add(userData);
        }
        return userFacadeData;
    }

我是测试新手,到目前为止我所了解的是,您在不知道实现的情况下测试某些东西。所以作为一名测试人员,我不知道这个人是怎么做到的,我所知道的是,他需要使用 Userservice,而我想要一个带有 UserData 的列表。所以我不知道,他使用model.getEmail() 来调用构造函数UserData()。

另外,例如我不需要测试的 UserService,因为我会为此编写一个额外的测试。

因此,如果我现在想真正测试该方法对所有数据的作用,我需要模拟 UserModels、UserData、RegionModels 以生成 asssertEquals 并使用 when().thenReturn()。

事实是,这是一个相当短的方法。由于 Facades 用于抽象获取和转换信息的复杂性,因此您可以在其中进行很多操作。所以当我有更大的方法时,我会有很多东西可以模拟。

这真的有必要吗?有什么我没有考虑到的吗?或者我该如何处理?如果我嘲笑,例如对 UserService 使用 when().thenReturn() 不是明智的,而不是仅仅让 UserService return 本身,因为它可能发生,UserService 可能有一个错误?

P.S.: 在 JUnit/Mockito 中测试方法的 return 类型的方法是什么?

谢谢!

我认为你嘲笑的东西比你实际需要的要多。对于示例方法,您只需要模拟 userService 实例。至于 return 类型检查,我认为您不应该真正测试它,因为 Java 是一种类型安全的语言。如果碰巧你 return 的类型与预期的不同,你肯定会得到一个异常 - 很可能甚至在编译期间。您的示例方法的测试应如下所示:

@Test
public void testGetUsersByRegion() {
    final UserModel userModel = new UserModel(); // initialise this with all the data you need
    final List<UserModel> userModels = Collections.singletonList(userModel);
    final UserService userService = mock(UserService.class);

    doReturn(userModels).when(userService).getUsersByRegion(any(RegionModel.class));

    final UserData userData = new UserData(userModel.getEmail());
    final List<UserData> expectedResult = Collections.singletonList(userData);

    // this assumes you have an instance of your facade and you have injected the mock user service to it
    final List<UserData> actualResult = usersFacade.getUsersByRegion(testRegion);

    verify(userService).getUsersByRegion(eq(testRegion));
    assertEquals(expectedResult, actualResult);
}