testing - 使用 Eclipse 进行 junit 测试

标签 testing junit

您好,我正在尝试使用 junit,但效果不佳。

这是我的代码。

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 测试。

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 作为项目的库。

最佳答案

JUnit 中的初始化错误通常是由错误的类路径引起的。请参阅此相关问题,该问题也遇到了初始化错误: Eclipse JUnit - possible causes of seeing "initializationError" in Eclipse window

最可能的原因是在解决该问题时,您使用的 JUnit 4 版本需要添加 hamcrest jar。您应该能够在项目的 Java 构建路径中添加 JUnit 4 库,而不是添加 junit 和 hamcrest jar。

您的导入大部分看起来是良性的,但您应该确认 safe.SafetyException 在您的类路径中。

最后,初始化错误可能是由在测试运行之前加载的代码中的静态初始化失败引起的。您发布的代码看起来很安全,但 SafetyException 类可能有一个要检查的初始化 block 。

关于testing - 使用 Eclipse 进行 junit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8778016/

相关文章:

java - 找不到导入 junit jupiter api

java - 模拟具有通用(?扩展集合)返回类型的方法时遇到问题

java - 基于枚举的单例实现和单元测试,将状态保留为枚举的副作用

java - JMockit @Mocked 注解导致其他测试失败

node.js - 由于 Mongoose.model,开 Jest 没有关闭

testing - 是否有一个网络应用程序可以为我提供一个缓慢加载的页面进行测试?

android uiautomator : UIObject. 带有日文字符的 setText 失败

.net - 如何:生成UnhandledException?

python - 如何在 pytest 中的 mark.parametrize 中使用固定装置

jboss - 在 IntelliJ 中使用 Arquillian 进行调试 - 托管容器