我有一个简单的方法,它在少量逻辑中使用当前用户的名称。该代码在使用中按预期工作,但我似乎无法进行测试。
我要测试的方法:
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;
//..