如何在 Java 中模拟 LdapTemplate 并获得完整的代码覆盖率
How to Mock LdapTemplate in Java and get full code coverage
我正在尝试使用 Mockito 全面覆盖一个非常简单的 junit 测试,我正在罢工。我的免责声明是我是 Mockito 的新手,尽管我想做的事情看起来很简单。
注意我的junit测试通过了,只是覆盖的不完整。当测试为 运行 时,方法中 returns 为真(用户列表不为空)的部分未获取 run/covered.
我的问题是...
ldap 是否需要准备任何测试数据?
你能简单地模拟 ldap 数据吗?
非常感谢您提供的任何见解。
这是正在测试的方法 (class name = LdapRepository)...
public Mono<Boolean> ldapTemplateQuery(Email email) {
Mono<Boolean> blockingWrapper = Mono.fromCallable(() -> {
List<LdapUser> users = ldapTemplate.find(query().where("cn").is(email.address()), LdapUser.class);
if (users.isEmpty()) {
return false;
} else {
return true;
}
}).onErrorResume(
original -> Mono.error(new UserNotFoundException("User not found for email " + email.address())));
return blockingWrapper.subscribeOn(Schedulers.elastic());
}
这是 junit class...
@RunWith(MockitoJUnitRunner.class)
public class LdapUserRepositoryMockTest {
private @InjectMocks LdapUserRepository ldapUserRepository;
@Mock
private LdapTemplate ldapTemplate;
Email email = new Email("abcd@xyz.com");
User user = new User(email);
static final String password = "VGVzdEAxMjM=";
@Test
public void ldapTemplateQueryTest() {
LdapUser ldapUser = new LdapUser(user, password.toCharArray());
List<LdapUser> users = new ArrayList<>();
users.add(ldapUser);
lenient().when(ldapTemplate.find(query().where(Mockito.anyString()).is(Mockito.anyString()), LdapUser.class)).thenReturn(users);
Mono<Boolean> locked = ldapUserRepository.ldapTemplateQuery(email);
StepVerifier.create(locked).expectNext(false).verifyComplete();
}
这是覆盖结果的屏幕截图...
在某人的大力帮助下,我得到了答案。正如您将在下面看到的,这是对宽松声明的一个相当小的更改。
希望这对一路走来的人有所帮助。
@RunWith(MockitoJUnitRunner.class)
public class LdapUserRepositoryMockTest {
private @InjectMocks LdapUserRepository ldapUserRepository;
@Mock
private LdapTemplate ldapTemplateMock;
Email email = new Email("abcd@xyz.com");
User user = new User(email);
static final String PASSWORD = "VGVzdEAxMjM=";
@Test
public void ldapTemplateQueryTest() {
LdapUser ldapUser = new LdapUser(user, PASSWORD.toCharArray());
List<LdapUser> users = new ArrayList<>();
users.add(ldapUser);
lenient()
.when(ldapTemplateMock.find(Mockito.any(), Mockito.eq(LdapUser.class)))
.thenReturn(users);
Mono<Boolean> locked = ldapUserRepository.checkIfAccountLocked(email);
StepVerifier.create(locked).expectNext(true).verifyComplete();
}
}
我正在尝试使用 Mockito 全面覆盖一个非常简单的 junit 测试,我正在罢工。我的免责声明是我是 Mockito 的新手,尽管我想做的事情看起来很简单。
注意我的junit测试通过了,只是覆盖的不完整。当测试为 运行 时,方法中 returns 为真(用户列表不为空)的部分未获取 run/covered.
我的问题是...
ldap 是否需要准备任何测试数据?
你能简单地模拟 ldap 数据吗?
非常感谢您提供的任何见解。
这是正在测试的方法 (class name = LdapRepository)...
public Mono<Boolean> ldapTemplateQuery(Email email) {
Mono<Boolean> blockingWrapper = Mono.fromCallable(() -> {
List<LdapUser> users = ldapTemplate.find(query().where("cn").is(email.address()), LdapUser.class);
if (users.isEmpty()) {
return false;
} else {
return true;
}
}).onErrorResume(
original -> Mono.error(new UserNotFoundException("User not found for email " + email.address())));
return blockingWrapper.subscribeOn(Schedulers.elastic());
}
这是 junit class...
@RunWith(MockitoJUnitRunner.class)
public class LdapUserRepositoryMockTest {
private @InjectMocks LdapUserRepository ldapUserRepository;
@Mock
private LdapTemplate ldapTemplate;
Email email = new Email("abcd@xyz.com");
User user = new User(email);
static final String password = "VGVzdEAxMjM=";
@Test
public void ldapTemplateQueryTest() {
LdapUser ldapUser = new LdapUser(user, password.toCharArray());
List<LdapUser> users = new ArrayList<>();
users.add(ldapUser);
lenient().when(ldapTemplate.find(query().where(Mockito.anyString()).is(Mockito.anyString()), LdapUser.class)).thenReturn(users);
Mono<Boolean> locked = ldapUserRepository.ldapTemplateQuery(email);
StepVerifier.create(locked).expectNext(false).verifyComplete();
}
这是覆盖结果的屏幕截图...
在某人的大力帮助下,我得到了答案。正如您将在下面看到的,这是对宽松声明的一个相当小的更改。
希望这对一路走来的人有所帮助。
@RunWith(MockitoJUnitRunner.class)
public class LdapUserRepositoryMockTest {
private @InjectMocks LdapUserRepository ldapUserRepository;
@Mock
private LdapTemplate ldapTemplateMock;
Email email = new Email("abcd@xyz.com");
User user = new User(email);
static final String PASSWORD = "VGVzdEAxMjM=";
@Test
public void ldapTemplateQueryTest() {
LdapUser ldapUser = new LdapUser(user, PASSWORD.toCharArray());
List<LdapUser> users = new ArrayList<>();
users.add(ldapUser);
lenient()
.when(ldapTemplateMock.find(Mockito.any(), Mockito.eq(LdapUser.class)))
.thenReturn(users);
Mono<Boolean> locked = ldapUserRepository.checkIfAccountLocked(email);
StepVerifier.create(locked).expectNext(true).verifyComplete();
}
}