Spring:模拟安全增强服务

Spring:模拟安全增强服务,spring,spring-security,mockito,spring-aop,spring-test,Spring,Spring Security,Mockito,Spring Aop,Spring Test,我们在服务层实现了部分安全性,因此我在MyService的一些方法中添加了@PreAuthorize注释 在MyServiceSecurityTest中,我只想测试安全角色权限矩阵,不需要任何业务逻辑。出于这个原因,我不得不模仿MyService。问题是Mockito和Spring安全性都使用CGLIB代理,而我的服务在Mockito.mock(MyService.class)之后没有使用@PreAuthorize进行增强 有没有办法模拟服务并保留@PreAuthorize逻辑 例如: @Se

我们在服务层实现了部分安全性,因此我在MyService的一些方法中添加了
@PreAuthorize
注释

MyServiceSecurityTest
中,我只想测试安全角色权限矩阵,不需要任何业务逻辑。出于这个原因,我不得不模仿
MyService
。问题是Mockito和Spring安全性都使用CGLIB代理,而我的服务在
Mockito.mock(MyService.class)
之后没有使用
@PreAuthorize
进行增强

有没有办法模拟服务并保留
@PreAuthorize
逻辑


例如:

@Service
public class MyService implements IMyService {

    @Override
    @PreAuthorize("hasAuthority('SYSOP')")
    public void someMethod(ComplexDTO dto) {
        // lots of logic and dependencies, require lots of stubbing.
    }
}

为了避免初始化
MyService#somethod
的所有依赖项,并在
myservicecuritytest
上构建
ComplexDTO
,我想模拟
myservicecuritytest
,但保留
@预授权
检查。

您需要进行集成测试,而不是单元测试。一般来说,在集成测试中不会看到模拟类,至少不会模拟正在测试的类,在这种情况下,我猜是
MyService

设置集成测试需要仔细阅读,但下面的简短示例应该会让您走上正确的道路

@RunWith(SpringRunner.class)
@SpringBootTest
@ActiveProfiles("myProfile")
public class MyServiceIT {

    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Autowired
    private TestRestTemplate restTemplate;

    @Test
    public void testMyService() {
        logger.info("testMyService");

        //user TestRestTemplate to call your service.
    }

}

编辑:在这个集成测试中,Spring正常启动。这意味着安全性的所有注释都被处理,需要创建的所有bean都被创建并正确注入。您可能需要控制的一件事是弹簧轮廓。。。。这可以通过我刚刚添加到示例中的
@ActiveProfiles(“myProfile”)
注释来完成。

另一个简单的方法就是覆盖您不想测试的服务方法。@cosmos我不熟悉
@MockBean
。我刚刚用
@MockBean-MyService
替换了
@Mock-MyService-service
,得到了相同的结果。我错过什么了吗?你为什么相信它会有帮助?@cosmos我不需要任何东西。我想测试所有的methods@cosmos我需要模拟并测试
@PreAuthorize(“hasAuthority('SYSOP')))public void someMethod(){…}
为什么不将要测试的整个类放到问题中,并删除不想向公众显示的逻辑。这样会更容易理解你的问题。这是我试图避免的选择。如果我用你的方式测试,我必须在一个地方测试
MyService
的安全性和业务逻辑,我开始认为很少有人面临这个问题。没有什么好办法。这可能意味着这是一种错误的方法——用这种测试覆盖服务安全性。另一方面,假设您的服务执行真正的重量级逻辑。一个方法运行需要10-30秒。现在您有大约30个角色,您需要针对每个角色测试每个方法。这要花很多时间。你能把逻辑短路吗?我不喜欢将测试场景烘焙到业务逻辑中,但如果做得优雅,可能不会太轻蔑。我的意思是,在通用集成测试中,您将针对几个案例测试每个端点。如果您要测试安全性,那么测试调用的数量将乘以角色/权限的数量。但是集成测试是一件非常重要的事情。我不知道业务逻辑在这里有什么帮助(