Итак, я хочу создать класс утверждений, подобный тому, как работает 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?
Насколько я знаю, у Юнит нет такого API, как assertThis(...).isNotNull()
. Вы уверены, что не думаете о AssertJ? Если да, то взгляните на §2.6.2 Пользовательские утверждения.
см. также: подколенное сухожилие
@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 в объекте»
Я думаю, что assertThis()
должен возвращать объект помощник (или промежуточный), который имеет метод isNotNull()
...
@GhostCat не совсем так. x instanceof Object
вернет false, если x равно нулю.
В итоге я сделал то, что @OscarRyz предложил ниже, с некоторыми настройками, и это работает! Проблема, с которой я столкнулся, заключалась в том, что тип возвращаемого значения мне нужен как класс утверждения, а не объект.
Я не думаю, что так работает 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, намного лучше, чем создание собственной (они уже решили кучу проблем, которые вы могли бы найти). Но в учебных целях это то, что вы можете попробовать.
user16320675, вы правы, но опять же, вы также не должны создавать свою собственную структуру утверждений, и если вы это сделаете, я думаю, ожидается, что вы знаете, как включить утверждения (кстати, флаг -ea
)
Это помогло! Это для целей обучения. Я немного подправил его, потому что я также хочу, чтобы isNotNull возвращал тот же объект, чтобы его можно было снова связать с чем-то другим.
junit с открытым исходным кодом. Вы можете просто посмотреть, что они делают, вместо того, чтобы просить SO посмотреть на это и вставить исходный код JUnit в ответ, нет? Кажется немного ленивым.