JUnit problem z Assert.assertEquals

0

Witajcie,
Mam problem z Assert.assertEquals. Mianowicie obiekty są takie same a wynik prezentuje sie nastepujaco:

1127162346
1127162346

java.lang.AssertionError: expected: Account<username password address port login password> but was: Account<username password address port login password>
Expected :Account<username password address port login password> 
Actual   :Account<username password address port login password>
 <Click to see difference>


	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 AccountsTest.successEqualsccount(AccountsTest.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)

Jak widac te 2 pierwsze liczby to hashcode ktory jest taki sam, a jednak test sie wywala. Jeden obiekt tworze normalnie a w drugim dane sa sczytywane z pliku. Jak utworze obiekt z polami a a a a a a to test normalnie przechodzi. O co chodzi?

Jak dam click to see difference to sie prezentuje tak:
Obiekt expected: Account<username password="password" address="address" port="port" login="login">
Obiekt actual: Account<username password="password" address="address" port="port" login="login">

Tutaj metoda testu:

    @Test
    public void successEqualsccount() {
        Account account = new Account("username", "password", new Proxy("address", "port", "login", "password"));
        Account other = Accounts.get();

        System.out.println(account.hashCode());
        System.out.println(other.hashCode());

        Assert.assertEquals(account, other);
    }

Dzieki za pomoc.

0

Oczywiscie dodam, ze jak 2 obiekty (i ten z dodawanymi recznie polami i ten ze sczytywanymi) maja pola ustawione na a a a a a a to test przechodzi ;). Ale jak wyzej mimo tego, ze wszystko sie zgadza i hashcode i pola to sie wywala czemu?

0

Kluczowe jest jak wygląda Account i jego metoda equals. hashCode nie ma tu nic do gadania. Symptomy wskazują na użycie == do porównywania stringów w equals

0

Dziękuję za odpowiedź. Fakt kody mieszające nie mają nic do tego, ale używam obiekty w HashSecie więc muszą być.

Klasa Account:

    @Override
    public boolean equals(Object o) {
        if(this == o) return true;
 
        if(o == null) return false;
 
        if(getClass() != o.getClass()) return false;
 
        Account other = (Account) o;
 
        return username.equals(other.username) && password.equals(other.username) && proxy.equals(other.proxy);
    }
 
    @Override
    public int hashCode() {
        return username.hashCode() + password.hashCode() + proxy.hashCode();
    }

Klasa Proxy:

    @Override
    public boolean equals(Object o) {
        if(this == o) return true;
 
        if(o == null) return false;
 
        if(getClass() != o.getClass()) return false;
 
        Proxy other = (Proxy) o;
 
        return address.equals(other.address) && port.equals(other.port) && login.equals(other.login) && password.equals(other.password);
    }
 
    @Override
    public int hashCode() {
        return address.hashCode() + port.hashCode() + login.hashCode() + password.hashCode();
    }

Wszystkie pola obiektów to String oraz w Account jest pole typu Proxy, które zawiera również stringi. Dziwna sprawa wydaje mi się, że metody porównania są napisane poprawnie, ale pomimo tego coś nie gra. Nie wiem co. Dalej wyrzucabłąd przy Assert.asserEquals.

0

Obiekty nie są równe chociaż posiadają te same dane. Teraz porownuje 2 rozne referencje o takich samych polach i tez dupa. Co moze byc do jasnej Anielki problemem?

1

Tu masz blad:

return username.equals(other.username) && password.equals(other.username) && proxy.equals(other.proxy);

**password.equals(other.username) **

0

Ahhh, ale głupi byk. Przepraszam bardzo. Przerzucałem wzrokiem i nic nie zauważyłem :P. Wybaczcie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1