Тестирование toString Junit - PullRequest
       4

Тестирование toString Junit

8 голосов
/ 17 апреля 2011

Учитывая метод toString:

public String toString()
{
    String accountString;
    NumberFormat money = NumberFormat.getCurrencyInstance();

    accountString = cust.toString();
    accountString += " Current balance is " + money.format (balance);
    return accountString;
}

как я могу проверить это с помощью Junit?

Ответы [ 3 ]

13 голосов
/ 17 апреля 2011

Вот как бы я это сделал:

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());
    }
}
5 голосов
/ 09 октября 2013

Мне тоже было интересно об этом, и хотя я думаю, что ответ Даффимо в порядке, он не самый лучший.

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

Так что я думаю, что лучше вместо использования assertEquals, я бы сказал, использовать assertTrue в сочетании с contains (проверяет, существует ли конкретная строка вString) и / или соответствия (использует регулярное выражение, чтобы увидеть, содержит ли String определенный шаблон).

Допустим, вы работаете с классом 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, созданный в предыдущем методе setUp)

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 (может быть, вы сначала разбили и добавили: не осознавая этого)

Больше тестов многих видов всегда лучше!

2 голосов
/ 29 ноября 2017

Очень хорошая библиотека для тестирования toString на модельных классах: https://github.com/jparams/to-string-verifier

Пример:

@Test
public void myTest()
{
    ToStringVerifier.forClass(Student.class).verify();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...