Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 模拟身份验证_Spring_Mockito - Fatal编程技术网

Spring 模拟身份验证

Spring 模拟身份验证,spring,mockito,Spring,Mockito,如何在下面的代码中模拟身份验证 您需要从SecurityContextHolder开始,还是可以以某种方式注入假身份 编辑: 我同意拉尔夫的第一个解决方案。不过,哔叽布解决方案似乎普遍适用。下面是经过测试的代码: final Authentication auth = mock(Authentication.class); when(auth.isAuthenticated()).thenReturn(true); SecurityContextHolder.setContext(new Se

如何在下面的代码中模拟身份验证

您需要从SecurityContextHolder开始,还是可以以某种方式注入假身份

编辑:

我同意拉尔夫的第一个解决方案。不过,哔叽布解决方案似乎普遍适用。下面是经过测试的代码:

final Authentication auth = mock(Authentication.class);
when(auth.isAuthenticated()).thenReturn(true);

SecurityContextHolder.setContext(new SecurityContext() {

    @Override
    public Authentication getAuthentication() {
        return auth;
    }

    @Override
    public void setAuthentication(Authentication auth) {
    }
});
编辑:见下文

您需要调用静态方法,而不能直接使用Mockito进行模拟。您可以将PowerMock与Mockito结合使用

如果它在测试中真的是一个例外,您可以通过创建本地类SecurityContextHolder来作弊。不要忘记删除相应的导入…:

class SecurityContextHolder {
    static Authentication auth;

    static SecurityContext getContext() {
        return new SecurityContext {
            public Authentication getAuthentication() {
                return auth;
            }
            public void setAuthentication(Authentication auth) {
                this.auth = auth;
            }
            }();
        }
    }
}
并在其中放入mockAuthentication.class

编辑:

不需要特别的课程,谢谢拉尔夫的主意。只要打电话:

final Authentication auth = mock(Authentication.class);
SecurityContextHolder.setContext(new SecurityContext {
        return new SecurityContext {
            public Authentication getAuthentication() {
                return auth;
            }
            public void setAuthentication(Authentication auth) {
                this.auth = auth;
            }
});
注意:我目前没有可用的开发系统,甚至无法测试语法,但原理应该可以工作。

编辑:见下文

您需要调用静态方法,而不能直接使用Mockito进行模拟。您可以将PowerMock与Mockito结合使用

如果它在测试中真的是一个例外,您可以通过创建本地类SecurityContextHolder来作弊。不要忘记删除相应的导入…:

class SecurityContextHolder {
    static Authentication auth;

    static SecurityContext getContext() {
        return new SecurityContext {
            public Authentication getAuthentication() {
                return auth;
            }
            public void setAuthentication(Authentication auth) {
                this.auth = auth;
            }
            }();
        }
    }
}
并在其中放入mockAuthentication.class

编辑:

不需要特别的课程,谢谢拉尔夫的主意。只要打电话:

final Authentication auth = mock(Authentication.class);
SecurityContextHolder.setContext(new SecurityContext {
        return new SecurityContext {
            public Authentication getAuthentication() {
                return auth;
            }
            public void setAuthentication(Authentication auth) {
                this.auth = auth;
            }
});

注意:我目前没有可用的开发系统,甚至无法测试语法,但princip应该可以工作。

问题是很难模拟静态方法调用,但您有不同的方法来处理这个特定的安全上下文问题

第一种方法:在测试中设置AuthenticationToken

 @Test
 public void testSomething() {

    try{
       SecurityContextHolder.getContext()
          .setAuthentication(new TestingAuthenticationToken(login, null));

       //invoke test object

     finally {
         SecurityContextHolder.clearContext();         
     }
 }
第二种方法:在SecurityContextHolder中注入模拟

如果希望通过模拟SecurityContext对示例进行更多控制,则可以执行以下操作:

 SecurityContextHolder.setStrategyName("com.test.MyStrategy")
然后,您需要一个实现SecurityContextHolderStrategy的类MyStrategy,并返回模拟的SecurityContext for SecurityContext getContext


第三种方法:在SecurityContext.setContext中注入模拟。问题是很难模拟静态方法调用,但您有不同的方法来处理这个特定的安全上下文问题

第一种方法:在测试中设置AuthenticationToken

 @Test
 public void testSomething() {

    try{
       SecurityContextHolder.getContext()
          .setAuthentication(new TestingAuthenticationToken(login, null));

       //invoke test object

     finally {
         SecurityContextHolder.clearContext();         
     }
 }
第二种方法:在SecurityContextHolder中注入模拟

如果希望通过模拟SecurityContext对示例进行更多控制,则可以执行以下操作:

 SecurityContextHolder.setStrategyName("com.test.MyStrategy")
然后,您需要一个实现SecurityContextHolderStrategy的类MyStrategy,并返回模拟的SecurityContext for SecurityContext getContext


第三种方法:在处理它的SecurityContext.setContext中插入一个mock。谢谢这就解决了。谢谢在问题中添加了代码的测试版本。泰铢:在问题中添加了代码的测试版本。泰铢: