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

如何使用mockito为同一个类的私有方法建立返回值存根

穆招
2023-03-14

我正在开发基于spring的项目,并使用JUnit+Mockito编写单元测试用例。当将布尔值存根到同一个测试类的私有方法时,我面临一个问题(在将访问级别更改为public后,我仍然未能存根布尔值)。

下面的代码片段显示了同样问题的模拟

class ABC {

    public String method1(User userObj){
        String result = "";

        if(!isValidUser(userObj.getSessionID())){
            return "InvalidUser";
        } else {
           // execute some logic
        }

        return result;
    }


    private boolean isValidUser(String sessionId) {
        // Here it calls some other class to validate the user 
        if (sessionId == null || UserSessionPool.getInstance().getSessionUser(sessionId) == null) {
            return false;
        } else {
            return true;
        }
    } 
}

在这里,我想为method1()编写一个测试用例。在类ABC中,我有一个名为IsValidUser()的方法,它通过查看一个全局会话池来帮助识别会话中的用户,该会话池保存所有登录的使用过的详细信息,即usersessionpool.getInstance().getsessionUser(sessionId)

在测试method1()时,当测试控制器触发ISValidUser(userobj.getsessionID())时,我希望从ISValidUser()方法返回true,以便继续测试实现逻辑的其余部分。

PowerMockito.doNothing().when(spyed_ABC_ClassObject, "isValidUser", true);
PowerMockito.doReturn(true).when(cntrl, "isValidUser", Mockito.anyString());
Whitebox.invokeMethod(spyed_ABC_ClassObject, "isValidUser", Mockito.anyString());
when(spyed_ABC_ClassObject.isValidUser(Mockito.anyString())).thenReturn(true);

Mockito.doNothing().when(spyed_ABC_ClassObject).isValidUser(Mockito.anyString());

共有1个答案

冷善
2023-03-14

你能试试这个吗。

@Before
public void setUp() {
    UserSessionPool mockConnectionPool = Mockito.mock(UserSessionPool.class);
}

@Test
public void testName() throws Exception {
    //given
    PowerMockito.mockStatic(UserSessionPool.class);
    BDDMockito.given(UserSessionPool.getInstance()(...)).willReturn(mockConnectionPool);
    Mockito.when(mockConnectionPool.getSessionUser(Mockito.anylong())).thenReturn(something);


    //then
    PowerMockito.verifyStatic();

}

希望这能有所帮助。快乐编码!

 类似资料:
  • 场景: 我正在使用独立设置测试Spring MVC控制器。 控制器从请求中的JSON对象获取参数。它在将JSON对象转换成java对象后调用一个服务。该服务使用JPA将其保存到DB,然后更新实体的Id字段并返回给控制器。在将实体转换成JSON之后,控制器将JSON响应返回给调用者。 我已经在我的测试类中模拟了该服务,并使用@InjectMocks注入到控制器中 模拟服务无法访问JPA实体的私有se

  • 如果不使用第三方的代码托管服务,而是要自己在服务器上建一个网上可访问的私有代码仓库, 你有几种选择: 通过SSH协议来访问仓库  通常最简单的办法是通ssh协议访问Git(Git Over SSH). 如果你在一台机器上有了一个ssh帐号, 你只要把“git祼仓库"放到任何一个可以通过ssh访问的目录, 然后可以像ssh登录一样简单的使用它. 假设你现在有一个仓库,并且你要把它建成可以在网上可访问

  • 我有以下代码 我对嘲笑不熟悉。我有以下疑问。我正在尝试测试公共方法。 我是否可以断言私有变量workDone的值? 是否可以验证超类中的方法调用? 如何在方法中模拟私有方法调用?

  • 我有一个带有私有属性的类,它是一个向量。做getter函数的最佳方法是什么? 返回整个向量:

  • 问题内容: 考虑以下代码: 编译器抱怨正在尝试对行为进行存根的行。关于如何使用存根方法返回带有有界通配符的类型的任何指针? 问题答案: 您也可以为此使用非类型安全方法doReturn, 正如在Mockito的Google组中讨论的那样。 尽管它比起来简单,但再次请注意,它不是类型安全的。如果您担心类型安全,那么米尔豪斯的答案是正确的。 额外细节 要明确的是,这是观察到的编译器错误, 我相信编译器已

  • 我有一个家庭作业,我应该写几个方法(例如,提示客户输入汽车类型并返回有效汽车类型的方法),然后我的程序应该显示汽车类型,租车天数,额外费用等。这是老师想让我写的第一种方法, 如何打印出此方法的返回值?我应该添加系统吗?(“汽车类型是...部分在提示为汽车类型()?