模拟String.valueof()

时间:2013-09-25 10:54:12

标签: java mocking mockito

我正在测试我的弹簧控制器并尝试执行以下操作

控制器

Authentication authentication = SecurityContextHolder.getContext()
            .getAuthentication();
    String role = String.valueOf(authentication.getAuthorities());
    if(role.contains("user")) {
        ...
    }

测试

@Test
public void testLoginUser() throws Exception {
    User user = new User();
    user.setLogin("user");
    user.setRoleid(1L);
    SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(user,user));
    when(String.valueOf(Collection.class)).thenReturn("user");

但是我得到了

org.mockito.exceptions.misusing.MissingMethodInvocationException

我需要iftrue并执行。
有什么办法可以做到吗?

2 个答案:

答案 0 :(得分:5)

由于
1. String课程是最终的,你不能用Mockito模拟最后的课程 2. String.valueOf是一个静态方法,你不能用Mockito模拟静态方法

来自Mockito FAQ

  

Mockito有什么限制

Needs java 1.5+
Cannot mock final classes    // String is Final
Cannot mock static methods... // String.valueOf is static

模拟authentication.getAuthorities()方法或使用Powermock

link可能会有所帮助。

答案 1 :(得分:1)

String.valueOf是一种静态方法,不会被Mockito嘲笑。您的表达式将简单地解析为值为"class java.util.Collection"的String实例。

Why does Mockito not mock static methods?