错误 java.lang.AssertionError: 期望值为:null<null>,但实际为:java.lang.String<null> 是什么意思?

13

我在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());
    }
}

编辑: 我所指的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,而不是如何获得豆子。我在这里和Google中都找不到帮助。
编辑2:为了进一步澄清,POJO本身是完全相同的Java类,我使用两个Hibernate映射文件。唯一的区别是映射中的catalog="this"catalog="that"。我使用两个不同的SessionFactory,因为数据存储在不同的模式(也称为目录)中,相同的MySQL实例。

bean.getThing() 返回什么?这种类型的 toString() 是什么样子的? - user180100
它的意思是 bean1.getThing() 不等于 bean2.getThing() - user180100
你可以发布你的Bean类吗? - Raveesh Sharma
7个回答

11

经过进一步的挖掘,我发现这些豆子并不相同。普通的DAO在Thing上设置了一个值为null的字符串,而测试数据的DAO则在Thing上设置了一个null。失败的断言是

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

我很高兴它失败了,因为价值观是不同的。虽然详细信息很神秘。


8

我曾经遇到过类似的问题,并通过使用String.valueOf(你的值)来解决,例如:String.valueOf("null")


1
这个帮了我..! - Shamseer

2

这似乎是与JUnit 4.12版本有关的问题。在GitHub上已经发布了一个问题,并已经得到解决。因此,解决方法是降级到4.11版本或使用最新版本的JUnit。


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- 来自审查 - sheilak
1
这是指向Github官方问题页面的链接。他们提供了两个解决方案: 1- 回到Junit 4.11版本。 2- 更新到最新版本的JUnit,该问题似乎已经得到修复。 - Iker Obregon Reigosa
感谢 @Andrew Spencer 的纠正。现在答案更好了。 - Iker Obregon Reigosa
@Iker 在切换到JUnit 4.11之后,问题仍然存在。我正在更新问题。 - Alessandro Da Rugna

2
请尝试以下的测试方法:
@Test
public void testNull() {
assertEquals(null, "");
}

0
我遇到了错误,因为我使用了“:”。
    @Test
fun trimRightNullIsSetToNull() {
    assertThat(trimRight(null), equalTo(nullValue()))
}

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

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

0

我发现正确答案让我感到困惑,让我认为这是GreenDAO存储String yourString = null和`null"之间的一些复杂差异,使我认为我需要升级JUnit到版本5,但幸运的是我找到了答案的真正含义,即:

这个错误简单地意味着你正在比较null和字符串"null",它们不相等。在我的情况下,我在GreenDAO中存储了"null",而我本来应该存储null


0
Int marks = student.getMarks();
marks = null;

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

这对我有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接