我们在服务层中嵌入了部分安全性,因此我@PreAuthorize
注释添加到一些MyService
方法中。
在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#someMethod
的所有依赖项并在MyServiceSecurityTest
构建ComplexDTO
,我想模拟MyServiceSecurityTest
但保留@PreAuthorize
检查。
您需要执行集成测试,而不是单元测试。 一般来说,你在集成测试中看不到模拟类,至少你不会模拟你正在测试的类,在这种情况下,我猜它是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")
注释来完成。