Пересмотр переменных Java-констант (общедоступная статика) с использованием Mockito / JUnit - PullRequest
0 голосов
/ 01 октября 2019

Мне нужно смоделировать постоянную переменную, чтобы проверить один из моих методов. Как я могу сделать это с Mokito и Junit.

  @Component( "mybean" )
  @org.springframework.context.annotation.Scope( value="session" )  
  public class MyBean {

    Public void methodToBeTested() {
       if (!AppConst.SOME_CONST.equals(obj.getCostCode())) {
         // some logic
       }
    }
 }

Класс AppConst

@Configuration
public class AppConst
{
   public static  String  SOME_CONST;
   public static  String  HOST_URL;

   @PostConstruct
   public void postConstruct()
   {
     SOME_CONST = "My Code";
     HOST_URL  = "Some URL";

   }
}

Итак, как из моего тестового класса junit, как я могу издеваться над AppConst и его переменными? Теперь, когда я запускаю его, я получаю сообщение об ошибке nullpointer.

Можно ли это сделать с помощью powermock? если да, пожалуйста, дайте образец

версию Mockito, которую я использую.

compile "org.mockito:mockito-all:1.9.5" compile "org.powermock:powermock-mockito-release-full:1.6.1"

1 Ответ

0 голосов
/ 02 октября 2019

Вместо насмешек было бы другое решение, чтобы можно было его протестировать:

public void methodToBeTested(SomeObject obj) {
   performLogic(AppConst.SOME_CONST, obj);
}

boolean performLogic(String check, SomeObject testObj) {
   if (!check.equals(obj.getCostCode())) {
     // some logic
     return true;
   }
   return false;
}

Таким образом, вы можете протестировать две вещи, обе из которых вместе показывают, что ваш код работает как задумано:

public void testMethodToBeTested() {
    MyBean mb = new MyBean() {
        @Override
        void performLogic(String check, SomeObject testObj) {
            assertSame("check constant is passed", AppConst.SOME_CONST, check);
        }
    }
    mb.methodToBeTested(new SomeObject());

    mb = new MyBean();
    SomeObject so = createSomeTestObject("My Code"); // not the actual constant but an equal String
    assertFalse("check some logic not occurred", mb.performLogic("My Code", so));
    so = createSomeTestObject("Not the constant");
    assertFalse("check some logic not occurred", mb.performLogic("Not the constant", so));
    assertTrue("check some logic occurred", mb.performLogic("My Code", so));
    // additional tests covering the actual logic
}

Другим решением может быть помещение условия оператора if в его собственный метод, например, shouldLogicOccurr(String check), и проверка этого метода по отдельности.

Другими словами: иногда необходимо реорганизовать ваш код всделать тесты легче, а иногда даже возможно вообще. Хорошим побочным эффектом является то, что в следующий раз вы реализуете что-то, что уже имеете в виду тестируемость, и в первую очередь создадите свой код, подходящий для этого.

Пересмешка - это хороший способ протестировать вещи с использованием сторонних библиотек. это не может быть изменено и имеет слишком много зависимостей для настройки, но если вы в конечном итоге используете это для своего собственного кода, у вас возникнет проблема проектирования.

...