тест джунит с затмением - PullRequest
1 голос
/ 08 января 2012

Привет, я пытаюсь использовать junit, и он не работает с *. 1001 *

Вот мой код.

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);
}



};

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

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);
}   
}

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

1 Ответ

0 голосов
/ 24 октября 2015

Ошибка инициализации в JUnit обычно вызвана неправильным путем к классам. Посмотрите этот связанный вопрос, который также пострадал от ошибки инициализации: Eclipse JUnit - возможные причины появления «initializationError» в окне Eclipse

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

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

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

...