Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java fest和assert-j与自定义映射之间的细微差异_Java_Junit_Java 7_Fest_Assertj - Fatal编程技术网

Java fest和assert-j与自定义映射之间的细微差异

Java fest和assert-j与自定义映射之间的细微差异,java,junit,java-7,fest,assertj,Java,Junit,Java 7,Fest,Assertj,在我工作的项目中,已经决定停止使用fest进行测试断言,而是使用assertj。我们正在使用Java 7,并且正在从fest版本2.0M10迁移到assertj核心版本2.4.1。代码库相当大,但从fest到assertj的过渡非常顺利,基本上更改了导入名称并处理了重命名的方法。 然而,我注意到在转换之后,我们在一个特定的测试类中遇到了测试失败(我应该补充一点,我们使用的是JUnit v4.12)。下面我展示了一个小型的、自包含的测试用例,突出了这个问题: import java.util.Co

在我工作的项目中,已经决定停止使用fest进行测试断言,而是使用assertj。我们正在使用Java 7,并且正在从fest版本2.0M10迁移到assertj核心版本2.4.1。代码库相当大,但从fest到assertj的过渡非常顺利,基本上更改了导入名称并处理了重命名的方法。 然而,我注意到在转换之后,我们在一个特定的测试类中遇到了测试失败(我应该补充一点,我们使用的是JUnit v4.12)。下面我展示了一个小型的、自包含的测试用例,突出了这个问题:

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.junit.Before;
import org.junit.Test;

class MyMap implements Map<String, Object> {
    private Map<String, Object> theMap = new HashMap<>();

    @Override
    public int size() {
        return theMap.size();
    }

    @Override
    public boolean isEmpty() {
        return theMap.isEmpty();
    }

    @Override
    public boolean containsKey(Object key) {
        return theMap.containsKey(key);
    }

    @Override
    public boolean containsValue(Object value) {
        return theMap.containsValue(value);
    }

    @Override
    public Object get(Object key) {
        return theMap.get(key);
    }

    @Override
    public Object put(String key, Object value) {
        return theMap.put(key, value);
    }

    @Override
    public Object remove(Object key) {
        return theMap.remove(key);
    }

    @Override
    public void putAll(Map<? extends String, ? extends Object> m) {
        theMap.putAll(m);
    }

    @Override
    public void clear() {
        theMap.clear();
    }

    @Override
    public Set<String> keySet() {
        return theMap.keySet();
    }

    @Override
    public Collection<Object> values() {
        return theMap.values();
    }

    @Override
    public Set<java.util.Map.Entry<String, Object>> entrySet() {
        return theMap.entrySet();
    }
}

public class TestMapComparison {
    private Map<String, Object> m1 = new HashMap<>();
    private MyMap m2 = new MyMap();

    @Before
    public void before() {
        m1.put("a", "b");
        m2.put("a", "b");
    }

    // Fails with:
    // java.lang.AssertionError:
    // expected: <'{'a'='b'} (MyMap@6f5fc7ad)'>
    // but was: <'{'a'='b'} (HashMap@3)'>
    @Test
    public void test1_Fest_m1_isEqualTo_m2() {
        org.fest.assertions.api.Assertions.assertThat(m1).isEqualTo(m2);
    }

    @Test // Pass
    public void test2_AssertJ_m1_isEqualTo_m2() {
        org.assertj.core.api.Assertions.assertThat(m1).isEqualTo(m2);
    }

    @Test // Pass
    public void test3_Fest_m2_isEqualTo_m1() {
        org.fest.assertions.api.Assertions.assertThat(m2).isEqualTo(m1);
    }

    // Fails with:
    // java.lang.AssertionError:
    // Expecting: <"{"a"="b"} (MyMap@5aedacd2)">
    // to be equal to:
    // <"{"a"="b"} (HashMap@3)"> but was not.
    @Test
    public void test4_AssertJ_m2_isEqualTo_m1() {
        org.assertj.core.api.Assertions.assertThat(m2).isEqualTo(m1);
    }
}
import java.util.Collection;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.Set;
导入org.junit.Before;
导入org.junit.Test;
类MyMap实现Map{
私有映射theMap=newhashmap();
@凌驾
公共整数大小(){
返回map.size();
}
@凌驾
公共布尔值为空(){
返回map.isEmpty();
}
@凌驾
公共布尔containsKey(对象键){
返回map.containsKey(键);
}
@凌驾
公共布尔包含值(对象值){
返回Map.ContainesValue(值);
}
@凌驾
公共对象获取(对象密钥){
返回map.get(键);
}
@凌驾
公共对象put(字符串键、对象值){
返回map.put(键、值);
}
@凌驾
公共对象删除(对象密钥){
返回地图。删除(键);
}
@凌驾

public void putAll(Map好吧,这个bug就在你的代码中,如果你测试equals()的契约,每个库都会发现这个bug,它必须是对称的:A等于B如果B等于A

我会简单地修复你的代码,并且很高兴通过迁移发现了这个bug。我也会改进测试并做一些改进

assertThat(a).isEqualTo(b);
assertThat(b).isEqualTo(a);

确保契约得到履行。

好吧,错误就在你的代码中,如果你测试equals()的契约,每个库都会发现错误,它必须是对称的:A等于B如果B等于A

我会简单地修复你的代码,并且很高兴通过迁移发现了这个bug。我也会改进测试并做一些改进

assertThat(a).isEqualTo(b);
assertThat(b).isEqualTo(a);

确保合同履行。

当然,谢谢,你是对的。我将加强测试并查看实际涉及的课程,以了解问题所在。再次感谢。当然,谢谢,你是对的。我将加强测试并查看实际涉及的课程,以了解问题所在s、 再次感谢。