错误 java.lang.AssertionError: 预期: null<null> 但曾经: java.lang.String 这<null>是什么意思?



我在Junit 4.12测试代码中遇到了这个奇怪的问题。该应用程序使用Spring Framework 4.1.6和Hibernate 4。当比较来自不同数据库的两个bean时,我得到了这个错误

java.lang.AssertionError: expected: null<null> but was: java.lang.String<null>
    at org.junit.Assert.fail(Assert.java:88)
    at org.junit.Assert.failNotEquals(Assert.java:834)
    at org.junit.Assert.assertEquals(Assert.java:118)
    at org.junit.Assert.assertEquals(Assert.java:144)
    at my.test.TestClass.method(TestClass.java:105)

这是什么意思?如何解决?

我的测试类使用SpringJUnit4ClassRunner运行,看起来类似于这个

@ContextConfiguration(
    {
        "classpath:beans-test.xml"
    }
)
@RunWith(SpringJUnit4ClassRunner.class)
public class TestMdtTechnicalGridGeneration extends AbstractJUnit4SpringContextTests {
    @Test
    public void method() {
            assertEquals(bean1.getThing(), bean2.getThing());
    }
}

edit:我所指的bean是一个简单的POJO,你可以想象它看起来如下:

public class Thing {
    private String thing;
    public void setThing(String thing) {
        this.thing = thing;
    }
    public String getThing() {
        return thing;
    }
}

我让他们使用Hibernate沿着的路线

SessionFactory mySF = (SessionFactory) applicationContext.getBean("mySessionFactory");
Query query = mySF.openSession().createQuery("FROM Thing WHERE code = '" + code + "'");
List<Thing> listThing = return query.list();
bean1 = listThing.get(0);

要解决关闭投票:我不确定所有这些细节是否会有所帮助,问题是我得到的奇怪的AssertError,而不是我如何得到bean。我在SO和谷歌都找不到帮助。

edit2:为了进一步澄清,POJO本身是完全相同的Java类,我使用了两个hibernate映射文件。唯一的区别是映射中的catalog="this"catalog="that"。我使用了两个不同的sessionfactories,因为数据存储在不同的模式(也称为目录)中,同一个MySQL实例中。

经过进一步的挖掘,我发现bean并不完全相同。常规DAO在Thing上设置值为null的字符串,而测试数据DAO在Thing上设置null。失败的断言是

@Test
public void testNull() {
    assertEquals(null, "null");
}

我很高兴它失败了,的值是不同的。不过,详细信息相当神秘。

我遇到了一个类似的问题,并通过用String.valueOf(此处为您的值)包装值来解决它,例如String.valueOf("null")

这看起来像是JUnit 4.12版本的问题。github上的JUnit打开了一个问题,现在已经修复。因此,解决方法是降级到4.11或采用JUnit的最新版本。

请尝试下面的测试方法

@Test
public void testNull() {
assertEquals(null, "");
}

我发现正确答案令人困惑,并认为GreenDAO存储String yourString = null和"null"的方式有一些复杂的区别,这让我认为我需要将JUnit升级到版本5,但幸运的是,我找到了答案的真正含义,即:

这个错误只是表示您正在比较null和字符串"null",这两个值不相等。在我的例子中,当我打算存储null时,我正在GreenDAO中存储"null"

我收到错误,因为我使用的是:

    @Test
fun trimRightNullIsSetToNull() {
    assertThat(trimRight(null), equalTo(nullValue()))
}

删除equalTo并直接比较两者都解决了错误:

    @Test
fun trimRightNullIsSetToNull() {
    assertThat(trimRight(null), nullValue())
}
Int marks = student.getMarks();
marks = null;

我们可以试试Assert.assertNull(student.getMarks());

这对我很有效。

相关内容

最新更新