2012-03-19 195 views
1

请问,我是Java新手。我怎么能写下面的程序的JUnit测试:编写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测试?

回答

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

通常的方式一个写代码是可测试的,而不是相反。

由于没有方法来查询状态,因此您的代码不是真正可测试的。 当您添加一些访问状态的方法时,您可以通过检查预期的更改来测试一种方法,该方法会更改测试单元中的状态。

基本上是一个测试

@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 

    } 

在当前的情况下,你只能测试你的代码是否会抛出异常。