我有一个简单的方法,只需少量逻辑即可使用当前用户的名称。该代码可以按预期使用,但我似乎无法通过测试。
我要测试的方法:
Mono<Circle> getCircleByIdWithUserPermission(final String circleId) {
return ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication)
.flatMap(authentication ->
circleRepository.findById(circleId)
.flatMap(circle -> circle.getUsers().contains(authentication.getName())
? Mono.just(circle) : Mono.error(new ForbiddenException()))
);
}
还有我到目前为止编写的测试:
@Test
@WithMockUser(username = "test-user")
public void getCircleByIdWithUserPermission() {
when(circleRepositoryMock.findById("1")).thenReturn(Mono.just(circleOne));
StepVerifier.create(circleServiceMock.getCircleByIdWithUserPermission("1"))
.expectNext(circleOne)
.expectComplete()
.verify();
}
但是测试始终以actual: onComplete())
失败,因此它永远不会使用circleRepositoryMock.findById("1")
。
如果我删除
ReactiveSecurityContextHolder.getContext()
.map(SecurityContext::getAuthentication)
并对测试值进行硬编码,它可以按预期工作。
这里有什么我可以俯瞰的地方吗?
编辑:
模拟只是一个简单的事情:
@RunWith(MockitoJUnitRunner.class)
public class CircleServiceImplTest {
@InjectMocks
private CircleServiceImpl circleServiceMock;
@Mock
private CircleRepository circleRepositoryMock;
//..