1

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

控制器

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

我需要我的if块来true执行。
有什么办法可以做到吗?

4

2 回答 2

6

因为
1. Stringclass 是 final 的,你不能用 Mockito 模拟 final 类。
2.String.valueOf是一个静态方法,你不能用 Mockito 模拟静态方法

来自Mockito 常见问题解答

Mockito 的局限性是什么

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

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

链接可能会有所帮助。

于 2013-09-25T10:58:32.370 回答
1

String.valueOf是一个静态方法,不会被 Mockito 模拟。您的表达式将简单地解析为具有 value 的 String 实例"class java.util.Collection"

为什么 Mockito 不模拟静态方法?.

于 2013-09-25T10:59:19.240 回答