2014-02-20 176 views
3

首先,我想对我的语言技能表示歉意,但我的母语不是英语。无效方法的Java单元测试

我有一点点的源代码,这是:

public void hello(List l){  
    switch (l.get(0) {  
    case "hello":  
     System.out.println("Hello!");  
    case "world":  
     System.out.println("World");  
     break;  
    }  
} 

而且我必须写一个单元测试,它可以测试这个代码。但我的技能还不够。请有人帮助我吗?一些例子或书或其他东西。我不知道我该如何开始它!

我很感激。

感谢

回答

4

你不能明显地测试,如果该方法返回,如果它是“无效”正确的值。但是,您可以测试它是否引发任何异常。如果要测试计算,则需要重构代码,以便计算是一个返回值的单独方法。

+0

-1:您的建议非常具有误导性。 OP **不需要**来重构*方法返回值*以便测试(正如其他答复者已经清楚地显示的那样)。最重要的是,测试方法*是否不抛出*几乎没有意义,因为它没有提供方法实际执行的信息,使得这种测试无用。 –

+0

如果OP可以修改代码,那么重新分解是正确的方法,而不是捕获输出流等。 –

2

你应该把你的代码分成两种方法 - 一种打印第二种结果,第二种可以很容易地进行单元测试。

+0

你能写一个关于你的例子的简单代码吗?我不明白你在想什么100%! :/ 我不是在等待解决方案,只是另一个例子,我可以使用我的问题。 – user3331579

+0

public void a(String i){System.out.println(b(i)); } //单元测试 public String b(String i){if(“a”.equals(i“)){return”b“;} else {return”c“;}} // unit testabkle – Smutje

+0

所以if我理解首先我必须更改我的源代码关于您的示例。然后我必须对新的源代码进行单元测试? – user3331579

1

为了能够测试此方法,您必须能够知道已打印到System.out的内容。因此,您必须将System.out替换为另一个流,并将其写入内存,以便在调用该方法后检查流的内容。这是可行的,但不是那么容易。

如果不是打印到System.out,它会使您的方法更具可重用性和更多可测试性,而不是打印到System.out。你也可以传递PrintStream类型的附加参数,方法可以写入该参数,这样可以通过传递一个可以写入字节数组的PrintStream来简化测试。

1

你可以像这样(使用Mockito)将输出流更改为模拟的输出流。

PrintStream mockStream = Mockito.mock(PrintStream.class); 
PrintStream original = System.out; 
System.out = mockStream; 

//call your method here: 
hello(myList); 

//check if your method has done its job correctly 
Mockito.verify(mockStream).println("Hello!"); 
//clean up 
System.out = orig; 

另外,不要忘记把你的break第一案后或将告吹并打印第二次为好。

+0

谢谢!所以,如果我低调,我必须把我的源代码放在/ /在这里调用你的方法?或者你写给我的这个代码是可以测试单元测试的,或者是什么?对不起,但我完全不明白! :/ – user3331579

2

你可以通过启动一个新的JVM,并调用调用此则捕捉输出代码测试的方法,但是......

简单重构代码,这样你就可以测试是:提取了一种方法,返回一个字符串,留下一个打印结果的包装方法,但是你测试提取的方法。