У меня есть некоторая логика для проверки следующим образом
public interface IValidation {
void validate();
}
public class ParameterValidator {
public void validate(IValidation... validations) {
for (IValidation validation : validations) {
validation.validate();
}
}
}
Одна из проверок на StringFormat выполняется следующим образом
public class StringFormatValidation implements IValidation {
public StringFormatValidation(StringFormatValidator stringFormatValidator, String param) {
...
}
@Override
public boolean equals(Object obj) {
if (obj == this) return true;
if (!(obj instanceof StringFormatValidation)) return false;
StringFormatValidation other = (StringFormatValidation) obj;
if (!Objects.equals(this.param, other.param)) return false;
return
Arrays.equals(SerializationUtils.serialize(this.stringFormatValidator),
SerializationUtils.serialize(other.stringFormatValidator));
}
}
где StringFormatValidator
является следующим функциональным интерфейсом
@FunctionalInterface
public interface StringFormatValidator extends Serializable {
boolean apply(String arg);
}
Я переопределил equals для сравнения лямбды на сериализованных байтах (не уверен ни в каком другом лучшем способе на данный момент).
У меня есть следующий модульный тест, который работает как ожидалось
@Test
public void testEquality() {
StringFormatValidation testFormatValidation1 = new
StringFormatValidation(StringFormatValidators::isCommaSeparated,"test1");
StringFormatValidation testFormatValidation2 = new
StringFormatValidation(StringFormatValidators::isCommaSeparated,"test2");;
Assert.assertEquals(testFormatValidation1, testFormatValidation2);
}
Но когда я пытаюсь проверить сайт вызова следующим образом,
@MockBean
ParameterValidator parameterValidator;
@Captor
ArgumentCaptor<IValidation> argumentCaptor;
@Test
public void testParameterValidations() {
testResource.doSomething(parameter1, "testParam");
Mockito.verify(parameterValidator).validate(argumentCaptor.capture());
List<IValidation> actualValidationList = argumentCaptor.getAllValues();
StringFormatValidation testFormatValidation = new
StringFormatValidation(StringFormatValidators::isCommaSeparated,
"testParam");
Assert.assertTrue(actualValidationList.contains(testFormatValidation));
}
Я получаю java.io.NotSerializableException: Non-serializable lambda
исключение для значения StringFormatValidation
в аргументе captor.
Я не понимаю, как захваченное значение в аргументе Mockito caprtor теряет свое сериализуемое поведение, учитывая, что это не поддельное значение, а фактически созданное на сайте вызова.
Примечание. Я упростил общие подписи и имена, чтобы сосредоточиться только на проблеме.