Создание утверждений

Итак, я хочу создать класс утверждений, подобный тому, как работает AssertJ. У меня проблемы с началом.


    public class Assertion {
    
        static object assertThis(Object o){}
        static Integer assertThis(int i){}
        static String assertThis(String s){}
        static Object isNotNull(){}
    
    }

Мой вопрос: как JUNIT принимает конкретный объект/строку/целое и сохраняет его? Допустим, я передаю Assertion.assertThis("hello").isNotNull() Я должен получить строковый объект обратно. Нужно ли поле для хранения объектного файла? И как это меняется при передаче различных объектов через метод assertThis?

junit с открытым исходным кодом. Вы можете просто посмотреть, что они делают, вместо того, чтобы просить SO посмотреть на это и вставить исходный код JUnit в ответ, нет? Кажется немного ленивым.

rzwitserloot 22.03.2022 19:02

Насколько я знаю, у Юнит нет такого API, как assertThis(...).isNotNull(). Вы уверены, что не думаете о AssertJ? Если да, то взгляните на §2.6.2 Пользовательские утверждения.

Slaw 22.03.2022 19:08

см. также: подколенное сухожилие

Andrew S 22.03.2022 19:11

@GhostCat, вот что я пробовал для assertThis(Object o) {return o;), но я застрял на isNotNull(). Мой код для IsNotNull() является общедоступным. Object isNotNull(){ if (this instanceof Object){if (this == null) throw new UnsupportedOperationException();} return this; } Но когда я пытаюсь запустить его через свой основной класс с помощью Assertion.assertThis(new Object()).isNotNull(), Intellij дает мне «невозможно разрешить метод isnotnull в объекте»

rd1346 22.03.2022 19:13

Я думаю, что assertThis() должен возвращать объект помощник (или промежуточный), который имеет метод isNotNull()...

user16320675 22.03.2022 19:15

@GhostCat не совсем так. x instanceof Object вернет false, если x равно нулю.

knittl 22.03.2022 20:23

В итоге я сделал то, что @OscarRyz предложил ниже, с некоторыми настройками, и это работает! Проблема, с которой я столкнулся, заключалась в том, что тип возвращаемого значения мне нужен как класс утверждения, а не объект.

rd1346 22.03.2022 20:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
7
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не думаю, что так работает JUnit (но AssertJ делает).

Но да, вы создаете экземпляр со статическим методом и сохраняете значение, а затем выполняете утверждение для этого значения.

Новые вызовы статического метода (также известного как фабричный метод) создадут другие экземпляры.

Вот очень простой пример:


class Assert {

   // Thing we're going to evaluate
   private String subject; 

   // Factory method. Creates an instance of `Assert` holding the value.
   public static Assert assertThat(String actual) {
      Assert a = new Assert();
      a.subject = actual;
      return a;
   }

   // Instance method to check if subject is not null
   public void isNotNull() {
     assert subject != null;
   }
}

// Used somewhere else...
import static Assert.assertThat;

class Main {
  public static void main( String ... args ) {
      assertThat("hello").isNotNull();
  }
}

Имейте в виду, что использование такой библиотеки, как AssertJ, намного лучше, чем создание собственной (они уже решили кучу проблем, которые вы могли бы найти). Но в учебных целях это то, что вы можете попробовать.

OscarRyz 22.03.2022 19:26

user16320675, вы правы, но опять же, вы также не должны создавать свою собственную структуру утверждений, и если вы это сделаете, я думаю, ожидается, что вы знаете, как включить утверждения (кстати, флаг -ea)

OscarRyz 22.03.2022 19:46

Это помогло! Это для целей обучения. Я немного подправил его, потому что я также хочу, чтобы isNotNull возвращал тот же объект, чтобы его можно было снова связать с чем-то другим.

rd1346 22.03.2022 20:38

Другие вопросы по теме