programing

JUnit에서는 assertNotEquals 메서드가 제공되지 않는 이유는 무엇입니까?

firstcheck 2023. 1. 21. 10:04
반응형

JUnit에서는 assertNotEquals 메서드가 제공되지 않는 이유는 무엇입니까?

JUnit 4를 제공하는 ?assertEquals(foo,bar) 아니다assertNotEqual(foo,bar)방??

assertNotSame에)assertSame 및 )의 개요assertFalse에)assertTrue안 넣었다는 게 이상해요.assertNotEqual.

덧붙여서, JUnit Addons는 제가 찾고 있는 방법을 제공하고 있는 것을 알고 있습니다.그냥 궁금해서 물어본 거예요.

모든 종류의 부정사항을 쉽게 기술할 수 있고, 어설션이 실패했을 때 무엇을 기대했는지, 무엇을 얻었는지에 대한 설명을 자동으로 작성할 수 있는 새로운 스타일의 어설션을 사용하는 것을 추천합니다.

assertThat(objectUnderTest, is(not(someOtherObject)));
assertThat(objectUnderTest, not(someOtherObject));
assertThat(objectUnderTest, not(equalTo(someOtherObject)));

이 세 가지 옵션은 모두 동일합니다. 가장 읽기 쉬운 옵션을 선택하십시오.

메서드의 간단한 이름을 사용하려면(및 이 시제 구문을 사용할 수 있도록 하려면) 다음과 같은 Import가 필요합니다.

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

게 있어요.assertNotEqualsJUnit 4.11의 경우:

import static org.junit.Assert.assertNotEquals;

도도궁궁궁궁궁궁. Assert API를 합니다. 객체가 동일한지 테스트하기 위해 다음과 같은 기능을 제공합니다.assertSame ★★★★★★★★★★★★★★★★★」assertNotSame.

물론, 다음과 같이 쓰기에 너무 길지는 않습니다.

assertFalse(foo.equals(bar));

이러한 어설션에서는 유감스럽게도 출력의 유일한 정보가 되는 부분은 테스트 방식의 이름이기 때문에 설명 메시지는 별도로 작성해야 합니다.

String msg = "Expected <" + foo + "> to be unequal to <" + bar +">";
assertFalse(msg, foo.equals(bar));

.assertNotEqual운 좋게도 미래에는 JUnit에 포함될지도 모른다: JUnit 22호

assertNotEqual의 부재는 정말로 비대칭이며 JUnit의 학습성을 조금 떨어뜨린다고 생각합니다.메서드를 추가하면 API의 복잡성이 경감될 수 있다는 점에 유의하십시오.대칭은 넓은 공간을 지배하는데 도움이 됩니다.제 추측으로는 누락의 원인은 그 방법을 요구하는 사람이 너무 적기 때문일 것입니다.그러나 assertFalse조차 존재하지 않았던 시절이 생각납니다.따라서 어려운 방법이 아니기 때문에, 많은 회피책이나 우아한 방법이 있는 것은 인정하지만, 최종적으로 그 방법이 추가되지 않을까 하는 긍정적인 기대를 가지고 있습니다.

이 파티에는 꽤 늦게 오지만, 다음과 같은 양식이 있습니다.

static void assertTrue(java.lang.String message, boolean condition) 

대부분의 '동등하지 않은' 경우에 사용할 수 있습니다.

int status = doSomething() ; // expected to return 123
assertTrue("doSomething() returned unexpected status", status != 123 ) ;

jUnit 4.12를 사용하여 java 8 환경에서 JUnit 작업을 하고 있습니다.

는 assertNotEquals 를 찾을 수 은 assertNotEquals를 사용해도 마찬가지입니다.
import org.junit.Assert;

바꿨어요.
assertNotEquals("addb", string);
접속합니다.
Assert.assertNotEquals("addb", string);

만약에 요.assertNotEqual않는 경우, 을 「인정하지 않다」로 해 주세요.Assert.assertNotEquals(,); 문제가 예요.

사람들이 assertNotEquals()를 원하는 명백한 이유는 빌트인을 먼저 풀 블로우 객체로 변환하지 않고 비교하기 위해서입니다.

자세한 예:

....
assertThat(1, not(equalTo(Integer.valueOf(winningBidderId))));
....

대.

assertNotEqual(1, winningBidderId);

안타깝게도 이클립스는 기본적으로 JUnit 4.11을 포함하지 않기 때문에 당신은 장황해야 합니다.

주의: "1"을 Integer.valueOf()로 랩할 필요는 없지만, 저는 에서 새로 돌아왔기 때문에.NET은 내 정확성에 의존하지 않는다.

AssertFalse보다는 Hamcrest를 네거티브 어설션에 사용하는 것이 좋습니다.이는 테스트 리포트에서 어설션 실패에 대한 차이가 나타나기 때문입니다.

assertFalse를 사용하면 보고서에 어설션 실패(즉, 실패 원인에 대한 정보 손실)만 표시됩니다.

보통 두 개의 객체가 같을 것으로 예상될 때 이 작업을 수행합니다.

assertTrue(obj1.equals(obj2));

또, 다음과 같이 합니다.

assertFalse(obj1.equals(obj2));

불평등할 것으로 예상되는 경우.이것이 당신의 질문에 대한 답변이 아니라는 것을 알지만, 그것이 제가 할 수 있는 가장 가까운 답변입니다.JUnit 4.11 이전 버전의 JUnit에서 수행할 수 있는 작업을 찾는 데 도움이 될 수 있습니다.

OP를 사용하다 Assert.assertFalse(expected.equals(actual))불평등을 표현하는 자연스러운 방법이 아닙니다.
저는 그 .Assert.assertEquals(),Assert.assertNotEquals()는 동작하지만 테스트의 실제 어설션 내용을 문서화하고 어설션이 실패했을 때 이해 또는 해석하는 것은 사용자에게 친숙하지 않습니다.
4 및 는 JUnit 4.11 'JUnit 5'를 제공합니다.Assert.assertNotEquals() )Assertions.assertNotEquals()JUnit 5)의 약칭입니다.

또는 오브젝트 상태를 어설션하기 위해 일반적으로 오브젝트 상태를 쉽게 파고들어 어설션의 의도를 명확하게 문서화하고 어설션 실패의 원인을 이해하기 쉬운 매처 API를 사용한다.

여기 예가 있습니다.
를 동물 싶다고 가정해 .createWithNewNameAndAge()method는 동물의 이름과 나이를 바꾸되 좋아하는 음식을 유지함으로써 새로운 동물의 개체를 만드는 방법이다.
를 들어, 제가 를고고고고이다를 사용한다고 가정해 .Assert.assertNotEquals()원래 개체와 새 개체가 다르다고 주장합니다.
여기 잘못된 구현이 있는 동물 클래스가 있습니다.createWithNewNameAndAge():

public class Animal {

    private String name;
    private int age;
    private String favoriteFood;

    public Animal(String name, int age, String favoriteFood) {
        this.name = name;
        this.age = age;
        this.favoriteFood = favoriteFood;
    }

    // Flawed implementation : use this.name and this.age to create the 
    // new Animal instead of using the name and age parameters
    public Animal createWithNewNameAndAge(String name, int age) {
        return new Animal(this.name, this.age, this.favoriteFood);
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getFavoriteFood() {
        return favoriteFood;
    }

    @Override
    public String toString() {
        return "Animal [name=" + name + ", age=" + age + ", favoriteFood=" + favoriteFood + "]";
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((favoriteFood == null) ? 0 : favoriteFood.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (!(obj instanceof Animal)) return false;

        Animal other = (Animal) obj;
        return age == other.age && favoriteFood.equals(other.favoriteFood) &&
                name.equals(other.name);
    }

}

JUnit 4.11+(또는 JUnit 5)를 테스트 러너 및 어설션 툴로 사용

@Test
void assertListNotEquals_JUnit_way() {
    Animal scoubi = new Animal("scoubi", 10, "hay");
    Animal littleScoubi = scoubi.createWithNewNameAndAge("little scoubi", 1);
    Assert.assertNotEquals(scoubi, littleScoubi);
}

테스트는 예상대로 실패하지만 개발자에게 제공된 원인은 실제로 도움이 되지 않습니다.값은 서로 달라야 하고 출력은 다음과 같습니다.toString()실제에 호소하는 결과Animal파라미터:

java.displaces를 클릭합니다.AssertionError: 값은 달라야 합니다.실제:동물

[이름=스쿠비, 나이=10세, 좋아하는 음식=맛있는 음식]

org.junit에서.Assert.fail(Assert.java:88)

그래, 오브젝트가 같지 않아.하지만 어디에 문제가 있나요?
테스트한 방법에서 올바르게 평가되지 않은 필드는 무엇입니까?하나? 둘? 전부?
그것을 발견하려면 , 당신은 그것을 파헤쳐야 한다.createWithNewNameAndAge()디버거를 구현/사용하는 동시에 테스트 API를 사용하면 예상된 것과 얻을 수 있는 것의 차이를 만들 수 있습니다.


JUnit 4.11을 테스트 러너로, Matcher API를 어설션 툴로 테스트

여기에서는 테스트의 같은 시나리오이지만 AssertJ(뛰어난 테스트매처 API)를 사용하여 AssertJ의 어설션을 만듭니다.Animal 예: 예:

import org.assertj.core.api.Assertions;

@Test
void assertListNotEquals_AssertJ() {
    Animal scoubi = new Animal("scoubi", 10, "hay");
    Animal littleScoubi = scoubi.createWithNewNameAndAge("little scoubi", 1);
    Assertions.assertThat(littleScoubi)
              .extracting(Animal::getName, Animal::getAge, Animal::getFavoriteFood)
              .containsExactly("little scoubi", 1, "hay");
}

물론 아직 테스트는 실패했지만, 이번에는 그 이유가 명확하게 설명되었습니다.

java.displaces를 클릭합니다.Assertion Error:

예상:

<["scoubi", 10, "scoubi"]>

정확하게 포함(및 같은 순서로 포함):

<["리틀 스쿠비", 1, "스쿠비"]>

그러나 일부 요소를 찾을 수 없습니다.

<["리틀 스쿠비", 1]>

기타는 예상하지 못했습니다.

<["scoubi", 10]>

Junit 5에서.MyTest.assertListNotEquals_AsertJ(MyTest.java:26)

은 '우리'에서 수 요.Animal::getName, Animal::getAge, Animal::getFavoriteFood동물의

"little scoubi", 1, "hay" 

단, 다음과 같은 값이 있습니다.

"scoubi", 10, "hay"

조사 장소를 알 수 있습니다.name ★★★★★★★★★★★★★★★★★」age이치노 ,, 음, 음, 음, 음을 도 있습니다.hay「」의 의 값Animal::getFavoriteFood()또한 반환된 것을 보다 정밀하게 주장할 수 있도록 한다.Animal 일부 속성에서는 개체가 동일하지 않아야 하지만 모든 속성에서는 동일하지 않아야 합니다.
따라서 매처 API를 사용하는 것이 훨씬 명확하고 유연합니다.

이 Modulo API를 하지 않은 이유, JUnit이 Modulo API를 제공하지 않은 이유assertNotEquals()JUnit이 이러한 방법을 제공하지 않은 것과 같은 이유입니다.

  • assertStringMatchesTheRegex(regex, str) ★★assertStringDoesntMatchTheRegex(regex, str)
  • assertStringBeginsWith(prefix, str) ★★assertStringDoesntBeginWith(prefix, str)

즉, 어설션 로직에서 원하는 종류의 특정 어설션 방법을 제공하는 것은 끝이 없습니다.

다음과 같은 구성 가능한 테스트 프리미티브를 제공하는 것이 훨씬 좋습니다.equalTo(...),is(...),not(...),regex(...)보다 읽기 쉽고 온전하게 하기 위해 프로그래머가 이것들을 조합하도록 합니다.

언급URL : https://stackoverflow.com/questions/1096650/why-doesnt-junit-provide-assertnotequals-methods

반응형