拜托,我是Java新手。如何为以下程序编写JUnit测试:
要测试的程序:
package codekeeper;
/**
*
* @author henryjoseph
*/
import java.util.*;
import java.io.*;
public class CodeKeeper {
ArrayList<String> list; //no specific amount..
String[] codes = {"alpha","lambda","gamma","delta","zeta"};
public CodeKeeper (String[] userCodes)
{
list = new ArrayList<String>();
for(int i =0; i<codes.length;i++)
addCode(codes[i]);
for(int i =0; i<userCodes.length;i++)
addCode(userCodes[i]);
for(String code:list)
System.out.println(code);
}
final void addCode(String code)
{
if(!list.contains(code))
list.add(code);
}
public static void main(String[] args) {
System.out.print("Enter your name and press Enter: ");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name = null;
String[] argu = new String[] {name};
try {
name = br.readLine();
argu = new String[] {name} ;
}catch (IOException e) {
System.out.println("Error!");
System.exit(1);
}
CodeKeeper keeper = new CodeKeeper(argu);
}
}
示例测试代码:
public class MyClassTest {
@Test
public void testMultiply() {
MyClass tester = new MyClass();
assertEquals("Result", 50, tester.multiply(10, 5));
}
}
这是编写Junit测试的标准方法吗?
答案 0 :(得分:1)
首先是一些背景,然后是一些例子。当您针对代码编写单元测试时,您正在测试应用程序的特定且有限的情况。这意味着每个单元测试应该至多涵盖函数(方法)可以接收的一(1)个场景。如果要同时测试多个功能,则需要执行集成测试。现在,如果我们采用您声明的以下函数:
final void addCode(String code)
{
if(!list.contains(code))
list.add(code);
}
假设codeKeeper
已正确初始化
适当的单元测试如下所示:
@Test(expected= NullPointerException.class)
public void testAddCode_1() throws Exception
{
codeKeeper.addCode(null);
}
另一个合适的用法如下:
@Test()
public void testAddCode_2() throws Exception
{
codeKeeper.addCode("myMagicCode");
assertTrue(codeKeeper.getList().contains("myMagicCode");
}
答案 1 :(得分:1)
通常一种编写代码的方式是可测试的,反之亦然。
由于没有查询状态的方法,因此您的代码无法测试。 当您添加一些方法来访问状态时,您可以通过检查预期的更改来测试一个确实改变测试单元状态的方法。
基本上是一个测试
@Test
public void testConcept() {
// 1. achieve a definite/initial state
// 2. change this state by one or more methods under test
// 3. assertXXX check expected changes
}
在您目前的情况下,您只能测试您的代码是否会抛出异常。