Я помог себе, хотя мне не нравится мое решение. Это скорее уловка, чем решение. Но сейчас я не могу думать о чем-то другом.
Я изменяю @ContextConfiguration на:
@ContextConfiguration(locations = "/context/authenticationStaff.xml", classes = { SpringApplicationContext.class })
XML настроен, так как он не может автоматически определять класс "SystemConfiguration.class" , Вместо этого SpringApplicationContext.class предоставляет «SystemConfiguration.class» как смоделированный компонент.
@Configuration
public class SpringApplicationContext {
@Mock
private SystemConfiguration mockedSystemConfiguration;
@Bean
public SystemConfiguration systemConfiguration() {
MockitoAnnotations.initMocks(this);
Arrays.asList(SystemConfigKey.values()).forEach(key -> {
Mockito.when(mockedSystemConfiguration.getConfig(key)).thenReturn(getConfig(key, key.getDefaultValue()));
});
Mockito.when(mockedSystemConfiguration.getConfig(SystemConfigKey.MIN_PASSWORD_LENGTH)).thenReturn(getConfig(SystemConfigKey.MIN_PASSWORD_LENGTH, "5"));
Mockito.when(mockedSystemConfiguration.getConfig(SystemConfigKey.PASSWORD_BCRYPTENCODER_COSTFACTOR)).thenReturn(getConfig(SystemConfigKey.PASSWORD_BCRYPTENCODER_COSTFACTOR, "5"));
return mockedSystemConfiguration;
}
private SystemConfigType getConfig(SystemConfigKey key, String value) {
SystemConfigType config = new SystemConfigType();
config.setKey(key);
config.setValue(value);
return config;
}
Теперь тестовый код выглядит следующим образом:
@SpringBootTest
@ExtendWith(SpringExtension.class)
@ContextConfiguration(locations = "/context/authenticationStaff.xml", classes = { SpringApplicationContext.class })
@EnableAutoConfiguration
public class PasswordPolicyServiceTest {
@Autowired
private PasswordPolicyService passwordPolicyService;
@Autowired
private PasswordHandlerService passwordHandlerService;
@Autowired
private SystemConfiguration systemConfiguration;
private final List<Reference> bcryptDigestRefs = new ArrayList<>();
private final DigestHistoryRule bcryptDigestRule = new DigestHistoryRule(new BCryptHashBean());
@BeforeEach
public void initMock() {
MockitoAnnotations.initMocks(this);
String password=passwordHandlerService.getPassword("my$Password");
bcryptDigestRefs.add(
new HistoricalReference(
"bcrypt-history",
password));
}
Это работает , но это не хорошее решение. Другие рекомендации очень приветствуются.