2012-01-08 4 views
1

Привет, Я пытаюсь использовать junit, и он не работает.junit test с Eclipse

Вот мой код.

package safe; 


import java.lang.reflect.*; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 
import safe.SafetyException; 

public class SafetyInspector { 

public static boolean isSafe(Class<?> clazz) throws SafetyException{ 


    if (clazz.equals(Object.class)) return true; 
    if (clazz == null) { 
     throw new SafetyException(); 
    } 

    Field fields[] = clazz.getDeclaredFields(); 
    for(Field f: fields){ 
     f.setAccessible(true); 
     int mod = f.getModifiers(); 
     if (Modifier.isFinal(mod)){ 
      continue; 
     } 
     else if (Modifier.isPrivate(mod)){ 
      Class<?> typeArray[] = new Class<?>[1] ; 
      typeArray[0] = f.getType(); 
      try { 
       Method mSet = clazz.getMethod("set" + f.getName().substring(0, 0).toUpperCase() + f.getName().substring(1),typeArray); 
       int modMet = mSet.getModifiers(); 
       if(!Modifier.isPublic(modMet)) return false; 
       if(!mSet.getReturnType().equals(void.class)) return false; 
      } 
      catch (SecurityException e) { 

       throw new SafetyException(); 

      } 
      catch (NoSuchMethodException e) { 

       return false; 
      } 

      try { 
       Class<?> typeArray2[] = new Class<?>[1] ; 
       Method mGet = clazz.getMethod("get" + f.getName().substring(0, 0).toUpperCase() + f.getName().substring(1),typeArray2); 
       int modMet2 = mGet.getModifiers(); 
       if(!Modifier.isPublic(modMet2)) return false; 

       if(!mGet.getReturnType().equals(f.getType())) return false; 
      } 
      catch (SecurityException e) { 

       throw new SafetyException() ; 
      } 
      catch (NoSuchMethodException e) { 

       return false; 
      } 





     } 



    } 


    return isSafe(clazz.getSuperclass()); 

} 

public static void sort(List<Class<?>> classes) throws SafetyException{ 

    for (int i = 1; i < classes.size(); i++) { 
     for (int j = 0; j < classes.size() - i; j++) { 
      if (compare(classes.get(j), classes.get(j + 1)) > 0) { 
       swap(classes, j); 
      } 
     } 
    }  

} 

public static void reset(Object object) throws SafetyException{ 

     Class c = object.getClass(); 
     Field fields[] = c.getDeclaredFields(); 
     for(Field f :fields){ 
      if (!isSafe(f.getClass())) 
      { 
       f.setAccessible(true); 
       try{ 
        if(!f.getClass().isPrimitive()){ 

        } 
        else if(f.getClass().equals(boolean.class)){ 
         f.setBoolean(object, false); 

        } 
        else{ 
         f.set(object, 0); 
        } 
       } 

       catch(Exception e) 
       { 
        throw new SafetyException(); 
       } 


      } 
     } 



} 




private static int compare(Class<?> o1, Class<?> o2) throws SafetyException { 

     Field[] fields1 = o1.getDeclaredFields(); 
     int count1 = 0; 
     for (Field f : fields1){ 
      if (isSafe(f.getClass())) count1++; 

     } 
     Field[] fields2 = o2.getDeclaredFields(); 
     int count2 = 0; 
     for (Field f : fields2){ 
      if (isSafe(f.getClass())) count2++; 

     } 

     if (count1 == count2) 
      return o1.getName().compareTo(o2.getName()); 

     else return count1- count2; 

    } 

private static void swap(List<Class<?>> list, int j) { 
    Class<?> temp = list.get(j); 
    list.set(j, list.get(j+1)); 
    list.set(j + 1, temp); 
} 



}; 

и вот код junit test, который они мне дали.

package test; 

import static org.junit.Assert.assertEquals; 


import java.util.Collections; 
import java.util.LinkedList; 
import java.util.List; 

import org.junit.Test; 

import safe.SafetyException; 
import safe.SafetyInspector; 


public class SafetyInspectorTest { 
@Test 
public void testIsSafeEmployee() throws SafetyException { 
    assertEquals(false, SafetyInspector.isSafe(Employee.class)); 
} 

@Test 
public void testResetEmployee() throws SafetyException { 
    Employee e = new Employee(123,3000); 
    SafetyInspector.reset(e); 
    assertEquals(0, e.id); 
    assertEquals(3000, e.getSalary()); 
} 

@Test 
public void testSort() throws SafetyException { 
    List<Class<?>> sortedClasses = new LinkedList<Class<?>>(); 
    sortedClasses.add(Employee.class); 
    List<Class<?>> classes = new LinkedList<Class<?>>(sortedClasses); 
    Collections.shuffle(classes); 
    SafetyInspector.sort(classes); 
    assertEquals(sortedClasses, classes); 
} 
} 

и когда я запускаю securityInspectorTest как junitTESTCLASS, я получаю ошибку инициализации. Я работаю с eclipse, если это помогает, и я поместил Junit в качестве библиотеки проекта.

+0

Звучит как проблема пути класса. –

+0

Я добавляю junit.rar к пути к классам – user1088557

+0

Так в чем же проблема? –

ответ

0

Ошибка инициализации в JUnit обычно вызвана неправильным путём. См. Этот связанный с ним вопрос, который также пострадал от ошибки инициализации: Eclipse JUnit - possible causes of seeing "initializationError" in Eclipse window

Наиболее вероятная причина в том, что в этом вопросе вы используете версию JUnit 4, для которой требуется добавить банку hamcrest. Вместо добавления junit и hamcrest jars вы должны иметь возможность добавить библиотеку JUnit 4 в Java Path Path вашего проекта.

Ваш импорт во многом выглядит доброкачественным, но вы должны подтвердить safe.SafetyException находится на вашем пути к классу.

И, наконец, ошибка инициализации может быть вызвана статической ошибкой инициализации в коде, который загружается до запуска вашего теста. Код, который вы опубликовали, выглядит безопасным, но класс SafetyException может иметь блок инициализации для проверки.