2014-09-03 2 views
0

Я создал несколько методов для установки строки, получения строки и получения гласных следующим образом. Как написать тестовый пример JUnit для getVowels()?Испытание Junit для возвращения гласных в строку ввода пользователя?

В тестовом примере, не следует ли указывать, какой правильный ответ? Так как пользователь может вводить любую строку, как мне сделать пропуск Junit или не выполнить тестовый пример? Что мне вводить в assertEquals, как в последней строке тестового примера?

package sec.vowels; 
import java.util.Scanner; 

public class MyStrings implements MyStringInterface { 
public String str; 
public char c; 
// Sets the value of the current string 
    public void setString(String str) { 
     Scanner input = new Scanner(System.in); 
     System.out.println("Please enter a sentence:"); 
     str = input.next(); 
     input.close(); 
     System.out.println(str); 
    } 
    // Returns the current string 
    public String getString() { 
     return str; 
     } 
    public String getVowels(){ 
     for (int i=0; i <str.length();i++){ 
      c = str.charAt(i);  
      if((str.charAt(i) == 'a') || 
        (str.charAt(i) == 'e') || 
        (str.charAt(i) == 'i') || 
        (str.charAt(i) == 'o') || 
        (str.charAt(i) == 'u')){ 
       } 
      System.out.println(c); 
      } 
     return str; 
    } 
} 

//test case. 
    public void testGetVowels() { 
     MyStrings test = new MyStrings(); 
     String results = test.getVowels(); 
     assertEquals(""); 
+1

Единичные испытания должны повторяться. Это означает, что вы обычно не хотите полагаться на ввод пользователя. –

+0

Поскольку метод 'getVowels()' не принимает аргументов и возвращает строку, это все, что вы можете проверить ... – alfasin

+0

Какова цель 'getVowels()'? Что он должен делать? Вам нужно понять это, чтобы сформулировать тесты для этого. Описывая требования к нам, вы сможете лучше понять. –

ответ

1

IMO, ваш setString() делает слишком много задач в одном методе. Это может быть одной из причин, по которым вы испытываете трудности с ее тестированием. Лично я хотел бы переписать его как

public void setString(String str) { 
    this.str = str; 
} 

Сейчас setString() не волнует, где String приходит. В тесте JUnit вы можете использовать фиксированный строковый литерал. В интерактивной программе main() может запросить пользователя для String (аналогично тому, как вы это делаете сейчас), а затем передать его setString().

Такая развязка идеальна во многих ситуациях.

Другое предложение заключается в замене повторных вызовов на str.getCharAt(i) на c, поскольку вы уже сохраняете этот результат в переменной. Кроме того, c должно быть объявлено локально getVowels(), так как оно не используется никакими другими способами.

+0

отличный ответ только о том, что он спрашивал о 'getVowels()' ... – alfasin

0

Во-первых, я бы рекомендовал следовать рекомендациям в the other answer, чтобы реорганизовать ваш код, чтобы он проходил проверку. Я хотел бы предложить добавить метод упаковки-частное:

void setString(String str) { 
    this.str = str; 
} 

Затем вы можете использовать конструкцию JUnit's parameterized test эффективно тестировать несколько значений. В приведенном ниже примере я создаю некоторые ожидаемые значения и тестирую класс с ним. В настоящее время он не работает, поэтому, возможно, вы можете использовать тест, чтобы исправить свои проблемы.

import static org.junit.Assert.*; 

import java.util.Arrays; 
import java.util.Collection; 
import java.util.List; 

import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.Parameterized; 
import org.junit.runners.Parameterized.Parameters; 

@RunWith(Parameterized.class) 
public class MyStringsTest { 

    private final String input; 
    private final String expected; 

    public MyStringsTest(String input, String expected) { 
    this.input = input; 
    this.expected = expected; 
    } 

    @Parameters 
    public static Collection<Object[]> makeParams() { 
    List<Object[]> result = 
     Arrays.asList(new Object[][] { 
      // These are pairs of (input, expected output) 
      new Object[] { "abcd", "a" }, // <----------------- Fails 
      new Object[] { "aeiou", "aeiou" }, // <------------- Passes 
      new Object[] { "AEIOU", "AEIOU" }, // <------------- Passes 
      new Object[] { "bcdfghjklmnpqrstvwxyz", "" } // <--- Fails 
     }); 

    return result; 
    } 

    @Test 
    public void testValidVowels() throws Exception { 
    MyStrings ms = new MyStrings(); 
    ms.setString(input); 
    assertEquals(expected, ms.getVowels()); 
    } 
} 
Смежные вопросы