2015-10-23 3 views
1

Как вы тестируете toString в JAVA? Я предполагаю, что это та же концепция, что и регулярное тестирование, но у меня действительно много проблем. Я не могу найти эту информацию в своем учебнике Big JAVA. Я прочитал все главы, которые мы рассмотрели не менее 5 раз. Я просто не вижу этого, и это никогда не охватывалось ни одной домашней работой.Тестирование единиц измерения в столбцах JAVA

Во-первых, я не понимаю, где в модульном тесте, где код представлен в первом примере, мой учитель положил «num» в assertTrue (text.contains (num));

Я понял, что она положила число, потому что мы следовали формату политики WholeLife. Ex.

WholeLifePolicy policy = new WholeLifePolicy(num, value, years, name); 

Я подумал, так как это был пример, я бы тогда сделать то же самое, и, например, для номинальной стоимости, как показано ниже.

assertTrue(text.contains("Face Value:")); 
     assertTrue(text.contains(value)); 

Это не скомпилировано, потому что оно говорит, что оно несовместимо, потому что число является двойным. Поэтому я попробовал удвоить. Единственное, что компилируется, это «num»

Так что очевидно, что ни один из моих тестов не проходит. Вот мой код. для класса WholeLifePolicy, следуйте по тестовому классу.

Почему используется "num"? Это потому, что это явный параметр объекта политики? Или это только потому, что число там»Или другая причина

Очевидно, что все мой код ниже // комментарии Все остальное было представлено в источнике лаборатории

/** 
    * Return a string representation of the WholeLifePolicy. 
    * 
    * @return String output string. 
    * 
    * <pre> 
    * Produce output in the following format: 
    * 
    * Policy Information: 
    * Policy #: WLP1000000 
    * Policy Years: 20 
    * Face Value: 50000.0 
    * Beneficiary: John Doe 
    * 
    * </pre> 
    */ 
    public String toString() 
    { 
     String output = "Policy Information:\n"; 
     output = output + "Policy #: " + this.getPolicyNum() + "\n"; 

     // your code here, finish the output string 
     output = output + "Face Value" + this.getFaceValue() + "\n"; 
     output = output + "Policy Years:" + this.getPolicyYrs() + "\n"; 
     output = output + "Beneficiary" + this.getBeneficiary() + "\n"; 
     return output; 

    } 

} 

ТЕСТ-КЛАСС:..

/** 
    * Test the toString method. 
    */ 
    @Test 
    public void testToString() 
    { 
     String num = "WLP1234567"; 
     double value = 50000.0; 
     int years = 20; 
     String name = "Katie Perry"; 
     WholeLifePolicy policy = new WholeLifePolicy(num, value, years, name); 

     String text = policy.toString(); 
     assertTrue(text.contains("Policy Information:")); 

     assertTrue(text.contains("Policy #:")); 
     assertTrue(text.contains(num)); 

     // your code here, finish the testing of the toString() method 
     // checking for both the headings and face value, policy years 
     assertTrue(text.contains("Face Value:")); 
     assertTrue(text.contains(num)); 


     assertTrue(text.contains("Policy Years:")); 
     assertTrue(text.contains(num)); 

     assertTrue(text.contains("Beneficiary:")); 
     assertTrue(text.contains(num)); 



    } 
} 
+0

это хороший вопрос. Это связано с тем, что эта книга Big Java охватывает только частичное тестирование на 2 страницах очень кратко, и я совершенно смущен тем, как эти тесты действительно проверяют вещи, и как, или если они даже связаны с обычным классом. Мне действительно нужна информация, которая написана для новичков, на языке начинающих, которая разбивает модульное тестирование на отдельные части и объясняет, что делает каждая часть и почему. Я все еще борюсь с этим классом toString после многих, многих, часов. – jforrest1980

ответ

0

вы можете разобрать двойной тип value в строку при выполнении тестов.

0

Очевидно, что вы должны пройти тест на недостающую в сифилис. Num уже проверен, чтобы быть включенным в метод toString.

Теперь вы должны проверить оставшиеся свойства, содержащиеся в выходе метода toString.

Например, вы можете использовать пустую строку, чтобы заставить преобразование в строку:

assertTrue(text.contains("Face Value:")); 
// this converts 'value' to string 
assertTrue(text.contains("" + value)); 

Этот метод также должен работать:

assertTrue(text.contains(Double.toString(value))); 
1

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

Это может быть столь же легко, как

@Test 
public void toString() { 
    WholeLifePolicy policy = new WholeLifePolicy("WLP1234567", 
    50000.0, 20, "Katie Perry"); 
    String expected = "Policy Information:\nPolicy #: WLP1000000\n" 
    + "Policy Years: 20\nFace Value: 50000.0\nBeneficiary: John Doe\n"; 
    assertEquals(expected, policy.toString()); 
} 

Это проверяет, что значения, введенные представлены, как вы ожидаете их. Если утверждение не выполняется, сообщение об ошибке сообщит вам, где находится несоответствие. Жесткое кодирование ожидаемой строки в порядке, вам не обязательно использовать те же значения, которые вы использовали для настройки теста.Если бы вы это сделали, вы бы дублировали тот же код, который вы использовали в тестируемом методе, что было бы большой частью работы (не только авансом, но и при каждом изменении кода).

Самое большое осложнение в современном мире - использование новых строк. Обычно разработчики могут запускать тесты локально на корпоративных серверах Windows и проводить тесты, выполняемые CI на другой платформе с разными концами строк. Если бы я хотел, чтобы это работало независимо от конца строки я бы изменить ToString использовать System.getProperty («line.separator»), и я бы изменить тест на то, как

static String lines(List<String> strings) { 
    String delimiter = System.getProperty("line.separator"); 
    StringBuilder builder = new StringBuilder(""); 
    for (String s : strings) { 
     builder.append(s); 
     builder.append(delimiter); 
    } 
    return builder.toString(); 
} 

@Test 
public void testToString() { 
    WholeLifePolicy policy = new WholeLifePolicy("WLP1234567", 
    50000.0, 20, "Katie Perry"); 
    List<String> expectedLines = new ArrayList<String>(); 
    expectedLines.add("Policy Information:"); 
    expectedLines.add("Policy #: WLP1000000"); 
    expectedLines.add("Policy Years: 20"); 
    expectedLines.add("Beneficiary: John Doe"); 
    assertEquals(lines(expectedLines), policy.toString()); 
} 

На самом деле, потому что а) Я ленив и b) newlines в toStrings делают для неорганизованных файлов журналов, я избегаю использования разделителей строк в методах toString.

Это может быть упражнение, предназначенное для обучения методам вызова и способам поиска документации по API (оба из которых являются важными навыками выживания). Метод String # содержит метод CharSequence как параметр (который реализует String), поэтому вам нужно преобразовать переменную в String, чтобы использовать ее. Если у вас есть ссылочный тип, вы можете вызвать toString на нем, для примитивов вы можете искать тип оболочки и либо преобразовать примитив в тип оболочки, либо найти статический метод, который принимает примитив и преобразует его в строку (см. the API documentation for java.lang.Double) ,

+0

Я ценю ваше углубленное объяснение, которое действительно помогло. К сожалению, мне вообще не разрешают менять тесты. Мне разрешено добавлять мой код ниже, где он говорит // добавьте сюда свой код. – jforrest1980

+0

@ jforrest1980: хорошо, проверьте метод contains, ему нужно взять строку. вы можете вызвать toString в аргументах, так что то, что вы передаете в метод, является строкой. –

Смежные вопросы