Я пытаюсь протестировать некоторый код, который вызывает JNI.Мой код выглядит примерно так:
public final class SomeJniClass {
public static native void SomeJniClass_someMethod(SomeObject someObject);
}
public class SomeObject {
boolean value;
public boolean getValue() {
return value;
}
public boolean setValue(boolean value) {
this.value = value;
}
}
public class ToBeTested {
public boolean wasChanged() {
SomeObject someObject = new SomeObject();
SomeJniClass.SomeJniClass_someMethod(someObject);
return someObject.getValue();
}
}
Теперь в нативном коде он изменяет value
.Обычно я выступал бы за рефакторинг кода для использования фабрики, и в некоторых случаях я делал это, чтобы позволить мне вводить макет, но из-за количества мест, где это делается, и того, насколько сложными являются некоторые вызовы.не уверен, что у меня будет время на полный рефакторинг.
Перед тем, как написать этот вопрос, я попытался https://stackoverflow.com/a/18069829/2599884, но когда я изменял значения внутри теста, они никогда не менялись.Я просто получаю состояние по умолчанию new SomeObject()
Это сделало меня параноиком, поэтому я выполнил отладку для бедного человека и бросил некоторые записи в журнал, и похоже, что совпадение никогда не произойдет.Вот как выглядит мой класс:
logger.log(Leve.WARNING, "Before!");
PowerMockito.doAnswer( invocation -> {
logger.log(Leve.WARNING, "Inside!");
Object[] args = invocation.getArguments();
((SomeObject) args[0]).setValue(true);
return null;
}).when(SomeJniClass.class);
SomeJniClass.SomeJniClass_someMethod(Mockito.any(SomeObject.class));
logger.log(Leve.WARNING, "After!");
Теперь приведенный выше пример является наиболее простым.У меня есть некоторые более сложные объекты, которые передаются в интерфейсы JNI.У меня также есть случаи, когда решения принимаются исходя из того, как объект был изменен.