当前位置: 首页 > 知识库问答 >
问题:

如果...在Spring启动中mockito测试中的其他语句问题

薛利
2023-03-14

如何编写一个mockito测试用例,如果...其他语句也包括异常测试,我对此很困惑。UserService是一个接口

用户工厂。JAVA

public class UserFactory {
    @Autowired
    private List<UserService> UserList;

    private final Map<String, UserService> UserMap = new HashMap<>();

    @PostConstruct
    public void initUserMap() {
        for (final UserService user : UserList) {
            UserMap.put(user.getUserId(), user);
        }
    }

    public UserService getUser(String userId) {
        final UserService userService = UserMap.get(userlId);
        if (null == userService) {
            throw new IllegalArgumentException("user are not in the group");
        }
        return userService;
    }
}

用户服务(接口)

public interface UserService{
  String getUserName();
  String getUserId();
}

这是我的测试,但它不正确。。。

@RunWith(MockitoJUnitRunner.class)
public class UserServiceTest {

    @Mock
    private UserService userService;

    @InjectMocks
    private UserFactory UserFactory;

    private Map<String, User> UserMap;

    private String userId = "123";

    @Before
    public void set_up(){
        UserMap = new HashMap<>();
        UserMap.put(userId, userService);
    }

    @Test
    public void getUser(){
        when(UserMap.get(userId)).thenReturn(userService);
        userService actual = userServiceFactory.getUser(userId);
        assertEquals(UserMap.get(userId), actual);
    }
}

共有1个答案

陆晓博
2023-03-14

1) 您编写的是单元测试,而不是切片测试或集成测试。在这里,你不需要把Spring作为一个组件来测试<如果你对这个领域感兴趣,你可以阅读我的问题/答案。

2)逻辑中的一个分支(if/ett)意味着您有多个场景。
不同的场景意味着通常不同的测试方法和有意义的名称。
您还可以依赖给定的/当/然后习语。

3) 因为在您的测试中,分支的输入信息是由mock提供的,这也意味着您将在每个测试方法中为mock注册不同的行为。

4) UserService不需要被嘲笑。它必须是模拟返回的值,而不是模拟本身。在这里,你必须模拟地图

5) 测试UserFactory,因此必须将其命名为UserFactoryTest

例如:

@RunWith(MockitoJUnitRunner.class)
public class UserFactoryTest {

    @Mock
    private Map<String, User> UserMap;

    @InjectMocks
    private UserFactory UserFactory;

    private String userId = "123";


    @Test
    public void getUser(){
       when(UserMap.get(userId)).thenReturn(userService);
       userService actual = userServiceFactory.getUser(userId);
       assertEquals(UserMap.get(userId), actual);
    }


    @Test
    public void getUser_with_unknown_userId(){
        Assertions.assertThrows(IllegalArgumentException.class, 
                            ()->  userServiceFactory.getUser(userId));
    }

}

你注意到,在第二种情况下,我没有为mock注册任何行为
默认情况下,Mockito将返回null,实际上这就是引发异常的原因。所以这很好
还要注意,我是通过依赖JUnit 5库而不是JUnit 4库来编写断言的,根据所使用的运行程序,您似乎使用了JUnit 4库
你应该考虑切换到JUnit 5进行新的测试。

 类似资料:
  • 所以读了一些书之后我看到了 不是使用可选选项的首选方式(http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html).但如果我有这样一个if语句: 这是最好的方法还是有更推荐的方法?

  • 我已经开始练习R闪亮,请在下面的代码中找到我试图进行计算的部分。请协助获取输出,因为我无法生成。 用户界面 库(发光)库(发光板) 我的页面 titlePanel(“零基成本模型”), 侧边栏 侧边栏面板(“输入客户详细信息”), 条件="input.tabselect==1", conditionalPanel(condition=“input.tabselect==5”, #submitBut

  • 下面的代码只是检查null控件并生成mView。如果提供了所有条件,则handleUrl(数据)方法有效。 当我将代码与RxJava一起使用时,我会在下面编写代码。 我写的两个代码都工作相同。然而,当我尝试向代码中添加新条件时,问题就开始了。例如,如果intent为null,我可以创建一些新的操作符。 示例代码; 但是我不能使用RxJava过滤器方法编写这段代码。一旦过滤器返回false,操作就完

  • 我想知道在ReactJSJSX中是否可以嵌套if else if? 我尝试过各种不同的方法,但我无法让它发挥作用。 我正在寻找 我已经试过了,但是我不能把它渲染出来。我试过各种方法。添加嵌套if后,它总是会中断。 使现代化 最后,我选择了将其移动到renderContent并调用该函数的解决方案。不过,这两个答案都有效。我想我可以使用内联解决方案,如果它用于简单的渲染和更复杂的情况下的渲染内容。

  • 根据angular 4项目中的状态条件,我必须将4个可用类(黄色、绿色、红色和白色)中的一个应用到我的div。 上述陈述中只有一个条件可以为真。 如何实现这一点(如果其他如果其他...Angular4) 中的其他语句?

  • 问题内容: 我注意到以下代码在Python中是合法的。我的问题是为什么?是否有特定原因? 问题答案: else仅当你的while条件为假时才执行该子句。如果你break超出循环范围,或者引发了异常,则不会执行该异常。 考虑它的一种方法是关于条件的构造: 一个示例可能类似于: