#java #testing #junit
#java #тестирование #junit
Вопрос:
Задан метод toString:
public String toString()
{
String accountString;
NumberFormat money = NumberFormat.getCurrencyInstance();
accountString = cust.toString();
accountString = " Current balance is " money.format (balance);
return accountString;
}
как я могу протестировать это с помощью Junit?
Ответ №1:
Вот как я бы это сделал:
public class AccountTest
{
@Test
public void testToString()
{
Account account = new Account(); // you didn't supply the object, so I guessed
String expected = ""; // put the expected value here
Assert.assertEquals(expected, account.toString());
}
}
Комментарии:
1. Да, это так. Вы должны сделать больше, чем то, что я опубликовал. Видите части, где я сказал, что вы должны что-то добавить? Есть ли у вас JUnit 4.x в вашем CLASSPATH? Это работает, если вы делаете это правильно. Вы должны выполнить надлежащий импорт и тому подобное. Я предполагаю, что вы кое-что знаете о Java.
2. java.lang. Ошибка утверждения: ожидалось: <Текущий баланс Edipo Federle составляет 100,00 долларов>, но было: <Текущий баланс Edipo Federle составляет 100,00 долларов>
3. Извините, но я исправил небольшую ошибку с / n в моей строке, но теперь: ожидается: java.lang. Строка<Текущий баланс Edipo Federle составляет $ 100,00>, но была: br.com.treinamento.logic. Учетная запись <Текущий баланс Edipo Federle составляет $ 100,00>
4. Теперь работа заключалась в том, чтобы забыть toString в obj, извините за невнимательность. Спасибо
Ответ №2:
Очень хорошая библиотека для тестирования toString в классах моделей: https://github.com/jparams/to-string-verifier
Образец:
@Test
public void myTest()
{
ToStringVerifier.forClass(Student.class).verify();
}
Комментарии:
1. Я здесь новичок, но буду иметь это в виду. Чтобы ответить @Antoni, это работает в тестировании junit.
Ответ №3:
Я тоже задавался этим вопросом, и хотя я думаю, что ответ duffymo хорош, он не самый лучший.
Проблемы, которые я вижу, — это вещи, которые вы не всегда можете знать, или, как вы указали в комментариях, новые строки и другие символы пробела, которые, вероятно, не имеют значения.
Поэтому я думаю, что лучше вместо использования assertEquals, я бы сказал, использовать assertTrue в сочетании с contains (проверяет, существует ли определенная строка в строке) и / или matches (использует regex, чтобы увидеть, содержит ли строка определенный шаблон).
Допустим, вы работаете с классом Name, определенным как
public class Name {
// each of these can only be alphabetic characters
String first;
String middle;
String last;
// a bunch of methods here
String toString(){
String out = "first=" first "n"
"middle=" middle "n"
"last=" last "n"
"full name=" first " " middle " " last;
}
}
Итак, теперь вы тестируете это следующим образом (предположим, что name — это объект Name, созданный в предыдущем методе настройки)
void toStringTest1(){
String toString = name.toString();
// this test checks that the String at least is
// outputting "first=" followed by the first variable
// but the first variable may incorrect 1's and 0's
assertTrue(toString.contains("first=" first));
}
void toStringTest2(){
String toString = name.toString();
// this test checks that the String has "first="
// followed by only alphabetic characters
assertTrue(toString.matches("first=[a-zA-Z]*?"));
}
Этот вид тестирования намного надежнее, чем то, что сказал duffymo. Если вы хотите, чтобы toString содержал хэш-код, вы не сможете заранее знать, каким может быть ожидаемое значение.
Это также позволяет вам охватить гораздо больше возможностей. Возможно, ваше единственное ожидаемое значение просто является случаем, для которого оно работает.
Кроме того, имейте в виду, что вы также хотели бы иметь тесты (в моем данном случае) для установки первой переменной. И хотя можно подумать, что было бы достаточно setFirst теста, лучше иметь больше тестов по всем направлениям, потому что может быть, что setFirst работает, но у вас что-то не получается в toString (возможно, вы сначала разделили и добавили a:, не осознавая этого)
Чем больше тестов разных видов, тем лучше!