我创建了一些设置字符串,获取字符串和获取元音的方法,如下所示。如何为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("");
答案 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());
}
}