Пересмешивание статических объектов, переданных в JNI - PullRequest
0 голосов
/ 27 февраля 2019

Я пытаюсь протестировать некоторый код, который вызывает 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.У меня также есть случаи, когда решения принимаются исходя из того, как объект был изменен.

...