Junit测试在用户输入字符串中返回元音?

时间:2014-09-03 01:31:54

标签: java string 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("");

2 个答案:

答案 0 :(得分:1)

IMO,您的setString()在一个方法中执行的任务太多了。这可能是您在测试时遇到问题的一个原因。就个人而言,我会将其重写为

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

现在setString()并不关心String的来源。在JUnit测试中,您可以使用固定的String字符。在交互式程序中,main()可以向用户询问字符串(类似于您现在的操作方式),然后将其传递给setString()

这种解耦在许多情况下都是理想的。

另一个建议是将str.getCharAt(i)的重复调用替换为c,因为您已将结果存储在变量中。此外,c应在getVowels()本地声明,因为它不用于任何其他方法。

答案 1 :(得分:0)

首先,我建议您按照the other answer中的建议重构代码以使其可测试。我建议添加一个package-private方法:

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());
  }
}